C# 关于c中的集合初始值设定项#

C# 关于c中的集合初始值设定项#,c#,collections,initializer,C#,Collections,Initializer,我承认我对c#还远远没有经验,所以这可能是显而易见的,但我不得不问——这两个代码示例之间有什么区别吗?如果不明显,第一条语句将在新运算符的末尾省略()。在这个上下文中是否有任何区别或者()只是多余的 private static Dictionary<string, string> dict1 = new Dictionary<string, string> { { "a", "A" }, { "b", "B" } }; private static D

我承认我对c#还远远没有经验,所以这可能是显而易见的,但我不得不问——这两个代码示例之间有什么区别吗?如果不明显,第一条语句将在新运算符的末尾省略()。在这个上下文中是否有任何区别或者()只是多余的

private static Dictionary<string, string> dict1 = new Dictionary<string, string>
{
    { "a", "A" },
    { "b", "B" }
};

private static Dictionary<string, string> dict2 = new Dictionary<string, string>()
{
    { "a", "A" },
    { "b", "B" }
};
private static Dictionary dict1=新字典
{
{“a”,“a”},
{“b”,“b”}
};
私有静态字典dict2=新字典()
{
{“a”,“a”},
{“b”,“b”}
};
在这个上下文中是否有任何区别或者()只是多余的

private static Dictionary<string, string> dict1 = new Dictionary<string, string>
{
    { "a", "A" },
    { "b", "B" }
};

private static Dictionary<string, string> dict2 = new Dictionary<string, string>()
{
    { "a", "A" },
    { "b", "B" }
};

没有区别。在使用集合初始值设定项时,添加
()
是可选的,但生成的编译IL是相同的。

不,没有。如果您检查IL代码,您会发现两个构造函数调用之间没有区别:

IL_0028:  newobj      System.Collections.Generic.Dictionary<System.String,System.String>..ctor
IL_002D:  stloc.1     // <>g__initLocal1
IL_002E:  ldloc.1     // <>g__initLocal1
IL_002F:  ldstr       "a"
IL_0034:  ldstr       "A"
IL_0039:  callvirt    System.Collections.Generic.Dictionary<System.String,System.String>.Add
IL_003E:  ldloc.1     // <>g__initLocal1
IL_003F:  ldstr       "b"
IL_0044:  ldstr       "B"
IL_0049:  callvirt    System.Collections.Generic.Dictionary<System.String,System.String>.Add
IL_004E:  ldloc.1     // <>g__initLocal1
IL\u 0028:newobj系统.集合.通用.字典..ctor
IL\u 002D:stloc.1//g\u initLocal1
IL\U 002E:ldloc.1//g\u initLocal1
IL_002F:ldstr“a”
IL_0034:ldstr“A”
IL_0039:callvirt System.Collections.Generic.Dictionary.Add
IL_003E:ldloc.1//g_uinitlocal1
IL_003F:ldstr“b”
IL_0044:ldstr“B”
IL_0049:callvirt System.Collections.Generic.Dictionary.Add
IL_004E:ldloc.1//g_initLocal1

除了让其他人阅读和/或支持您的代码的可读性之外,没有什么区别。我认为大多数C#程序员都熟悉使用第二个示例来声明新词典。如果要创建一个
Dictionary dict1=newdictionary,也要保持在中间()
作为非方法,那么您将获得编译器error@DJKRAZE,我知道字典dict1=新字典不会编译,这就是为什么我对我的两个示例都会编译感到惊讶的原因