C# 如果使用对象初始值设定项,性能是否会有所提高,还是会有喘息现象?

C# 如果使用对象初始值设定项,性能是否会有所提高,还是会有喘息现象?,c#,C#,因此,比较如下: MyClass foo = new MyClass(); foo.Property1 = 4; foo.Property2 = "garfield"; 及 这是语法上的甜点,还是实际上有某种性能提升(不管可能有多小?没有,性能没有提升。在后台,编译器将生成对相同属性和字段的赋值。它看起来就像您的扩展版。对于标准类型,它是全糖的。对于匿名类型,您可能会发现它在幕后使用构造函数,但由于初始化器语法是分配它们的唯一方法,因此这是一个没有实际意义的问题 这涉及的调用比(比如)一个特定

因此,比较如下:

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


这是语法上的甜点,还是实际上有某种性能提升(不管可能有多小?

没有,性能没有提升。在后台,编译器将生成对相同属性和字段的赋值。它看起来就像您的扩展版。

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

这涉及的调用比(比如)一个特定的构造函数要多一些,但如果您看到结果的不同,我会感到惊讶。只需使用初始值设定项语法-它更友好-o

实际上,使用对象初始值设定项可能比调用构造函数然后分配属性慢得多,因为它有一个额外的分配:

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

在将引用指定给变量之前,所有属性都已指定。如果重用变量,则此差异是可见的:

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
之后),
共享的值。First
仍然是“First 1”-即
共享的
尚未分配新值

正如马克所说的那样,你几乎肯定永远也看不出有什么不同


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

它的语法糖,编译器生成的IL与.NET 3.5中引入对象初始值设定项之前完全相同。

我之前有一个类似的MP3文件。你的评论促使我留下了类似的评论…哇,这一条真的吸引了重量级人物,在前4个答案中有20万名代表。听起来像是一个全面的假设。证据还是引证?
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" };        
    }
}