如果使用对象初始化程序,是否有性能改进,还是它是错误的?

那么,比较将是:

MyClass foo = new MyClass(); foo.Property1 = 4; foo.Property2 = "garfield"; 

 MyClass foo = new MyClass { Property1 = 4, Property2 = "garfield" }; 

它是语法糖,还是实际上有某种性能提升(不管它有多么微小?)

使用对象初始化程序实际上可能非常非常轻微地调用构造函数然后分配属性,因为它有一个额外的赋值:

 MyClass foo = new MyClass(); foo.Property1 = 4; foo.Property2 = "garfield"; 

VS

 MyClass tmp = new MyClass(); tmp.Property1 = 4; tmp.Property2 = "garfield"; MyClass foo = tmp; 

在将引用分配给变量之前,将全部分配属性。 如果重用变量,这种差异是可见的:

 using System; public class Test { static Test shared; string First { get; set; } string Second { set { Console.WriteLine("Setting second. shared.First={0}", shared == null ? "n/a" : shared.First); } } static void Main() { shared = new Test { First = "First 1", Second = "Second 1" }; shared = new Test { First = "First 2", Second = "Second 2" }; } } 

输出显示在Main的第二行中,当设置Second时(在First之后), shared.First的值仍然是“First 1” – 即,尚未为shared分配新值。

正如马克所说,你几乎肯定不会真正发现差异。

保证匿名类型使用构造函数 – 该表单在C#3语言规范的7.5.10.6节中给出。

完全是标准类型的 。 对于匿名类型,您可能会发现它在幕后使用构造函数,但由于初始化器语法是分配它们的唯一方法,因此这是一个没有实际意义的点。

这涉及比一个特定的构造函数更多的调用 – 但是如果你看到了结果的差异,我会感到惊讶 。 只需使用初始化程序语法 – 它更友好; -o

没有性能改善。 在引擎盖下,编译器将生成对相同属性和字段的赋值。 它看起来就像你的扩展版本。

我是语法糖,编译器生成与.NET 3.5中引入对象初始化器之前相同的精确IL