从初始化程序创建列表

时间:2014-01-27 14:32:02

标签: c# list initializer

之间有什么区别吗?
var list = new List<UserType>
{
    new UserType(...),
    new UserType(...),
};

var list = new List<UserType>()
{
    new UserType(...),
    new UserType(...),
};

我曾经常常使用第二个认为我只需要调用列表的无参数(或任何其他)构造函数...

2 个答案:

答案 0 :(得分:5)

它是一样的。来自MSDN

  

使用对象初始值设定语法可以为a指定参数   构造函数或省略参数(和括号语法)

同样的规则适用于列表和普通对象初始值设定项:

var foo = new Bar {
    Prop = "value"
};

答案 1 :(得分:3)

不,没有区别。生成的IL 完全相同:

IL_0001:  newobj      System.Collections.Generic.List<UserQuery+UserType>..ctor
IL_0006:  stloc.1     // <>g__initLocal0
IL_0007:  ldloc.1     // <>g__initLocal0
IL_0008:  newobj      UserQuery+UserType..ctor
IL_000D:  callvirt    System.Collections.Generic.List<UserQuery+UserType>.Add
IL_0012:  nop         
IL_0013:  ldloc.1     // <>g__initLocal0
IL_0014:  newobj      UserQuery+UserType..ctor
IL_0019:  callvirt    System.Collections.Generic.List<UserQuery+UserType>.Add
IL_001E:  nop         
IL_001F:  ldloc.1     // <>g__initLocal0
IL_0020:  stloc.0     // list

即使实例化一个新的List并且自己调用.Add也非常相似,即:

var list = new List<UserType>();

list.Add(new UserType());
list.Add(new UserType());

...生成:

IL_0001:  newobj      System.Collections.Generic.List<UserQuery+UserType>..ctor
IL_0006:  stloc.0     // list
IL_0007:  ldloc.0     // list
IL_0008:  newobj      UserQuery+UserType..ctor
IL_000D:  callvirt    System.Collections.Generic.List<UserQuery+UserType>.Add
IL_0012:  nop         
IL_0013:  ldloc.0     // list
IL_0014:  newobj      UserQuery+UserType..ctor
IL_0019:  callvirt    System.Collections.Generic.List<UserQuery+UserType>.Add

略有不同 - 看起来不同的是生成临时变量并将其分配给list与直接创建和操作list