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

Pau*_*aul 10 c#

那么,比较将是:

MyClass foo = new MyClass();
foo.Property1 = 4;
foo.Property2 = "garfield";
Run Code Online (Sandbox Code Playgroud)

MyClass foo = new MyClass { Property1 = 4, Property2 = "garfield" };
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 18

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

MyClass foo = new MyClass();
foo.Property1 = 4;
foo.Property2 = "garfield";
Run Code Online (Sandbox Code Playgroud)

VS

MyClass tmp = new MyClass();
tmp.Property1 = 4;
tmp.Property2 = "garfield";
MyClass foo = tmp;
Run Code Online (Sandbox Code Playgroud)

在将引用分配给变量之前,所有属性都已分配.如果重用变量,这种差异是可见的:

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" };        
    }
}
Run Code Online (Sandbox Code Playgroud)

输出显示在第二行中Main,当Second设置(之后First)时,值shared.First仍然是"第一个" - 即shared尚未分配新值.

正如Marc所说,你几乎肯定不会真正发现差异.

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


Mar*_*ell 7

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

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