使用初始化程序添加项目到列表还是添加定义的变量?

时间:2014-01-13 13:35:23

标签: c# list

我只想问你initalizer add方法和直接可靠的add方法之间是否有区别。

以下代码之间:

var list = new List<Item>();
for (int i = 0; i < 100000; i++)
{
    list.Add(new Item() { ID = i, Title = "Item" });
}

此代码:

var list = new List<Item>();
for (int i = 0; i < 100000; i++)
{
    var item = new Item() { ID = i, Title = "Item" };
    list.Add(item);
}

有什么不同吗? 程序编译时它们是相同的代码吗? 如果我建立一个从1到100万的循环,我仍然会得到相同的结果(忽略其他效果)?

4 个答案:

答案 0 :(得分:1)

没有区别。查看IL代码,看看new Item()必须存储才能将其添加到列表中。但是,从代码角度来看,第一个代码段看起来更清晰。

答案 1 :(得分:1)

没有区别(编译器足够智能在两种情况下生成符合要求的高效代码如果优化在),但是你可以使代码更好一些通过设置列表 Capasity

int size = 100000;

var list = new List<Item>(size); // <- setting capacity

for (int i = 0; i < size; ++i)
  list.Add(new Item() { ID = i, Title = "Item" });

答案 2 :(得分:0)

没有真正的区别,在第二个示例中,您只是将新实例化的项目存储在变量中,然后将其添加到列表中,而在第一个示例中,您实例化并添加到同一行。一旦你离开括号,你存储物品的变量就会被破坏。

除非你打算调试项目中的内容,否则我更喜欢第一组代码,看起来更好。

答案 3 :(得分:0)

我编译了exe并且查看了反射器上的编译代码。 这是来自PreCompiled Source的代码:

        list.Add(new Item() { ID = 2, Title = "Item" });
        Item yeni = new Item() { ID = 4, Title = "Item" };
        list.Add(yeni);

以下是编译代码:

private static void Main(string[] args)
{
       List<Item> list = new List<Item>();
       Item <>g__initLocal0 = new Item();
       <>g__initLocal0.ID = 2;
       <>g__initLocal0.Title = "Item";
       list.Add(<>g__initLocal0);
       Item <>g__initLocal1 = new Item();
       <>g__initLocal1.ID = 4;
       <>g__initLocal1.Title = "Item";
       Item yeni = <>g__initLocal1;
       list.Add(yeni);
}

我刚刚意识到编译器接受了ur参数并定义了一个新的veriable而不是将它添加到列表中。 谢谢你们所有人。