那么,比较将是:
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节中给出.
它完全是标准类型的糖.对于匿名类型,您可能会发现它在幕后使用构造函数,但由于初始化器语法是分配它们的唯一方法,因此这是一个没有实际意义的点.
这涉及比一个特定的构造函数更多的调用 - 但是如果你看到了差异,我会感到惊讶.只需使用初始化程序语法 - 它更友好; -o
归档时间: |
|
查看次数: |
2466 次 |
最近记录: |