我只想问你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万的循环,我仍然会得到相同的结果(忽略其他效果)?
答案 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而不是将它添加到列表中。 谢谢你们所有人。