2009-07-31 100 views
10

因此,比较会之间:如果使用对象初始值设定项,性能是否会提高?

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

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

它是语法糖,或者是有实际某种性能增益的

(不过分钟,它很可能是什么?)
+0

哇,这一个真正吸引重打者,200K代表在第一4个答案。 – JeremyWeir 2009-08-01 07:05:28

回答

18

它实际上可能非常,非常稍慢使用对象初始化,而不是调用构造函数,然后分配的属性,因为它有一个额外的任务:

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值仍然“第一1“ - 即shared尚未分配新值。正如马克所说,你几乎肯定永远不会发现有什么不同。

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

+0

国际海事组织,值得使用绿色记号 – 2009-07-31 22:28:27

2

不,没有性能改进。在这种情况下,编译器将生成对相同属性和字段的赋值。它看起来就像你的扩展版本。

7

对于标准类型,它是完全糖。对于匿名类型,您可能会发现它在后台使用构造函数,但由于初始化程序语法只是的分配方式,所以这是一个有争议的问题。

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

1

I'ts语法糖和编译器生成完全相同的IL像以前那样被引入在对象初始化.NET 3.5

相关问题