.NET 3.5中的新构造函数

bom*_*sen 3 .net c#

这真是一个简单的问题.我一直在.NET 3.5(C#)中使用新类型的构造函数,但我想知道它们被称为什么,如果它们有一个名字:)

我正在谈论的构造函数是这样的:

Customer c = new Customer()
{
    Name = "Bo"
};
Run Code Online (Sandbox Code Playgroud)

Jas*_*yon 15

您正在使用常规无参数构造函数,但也使用称为对象初始化程序的新功能.


Win*_*ith 8

正如其他人已经指出的那样,它们被称为对象初始化器.

但是,它们不是构造函数,您不应该像这样引用它们.

请考虑以下代码:

public class TestHarness
{
    static void Main(string[] args)
    {
        Class1 class1 = new Class1();
        class1.Foo = "foo";

        Class2 class2 =
            new Class2
            {
                Foo = "foo"
            };
    }
}

public class Class1
{
    public string Foo { get; set; }
    public string Bar { get; set; }
}

public class Class2
{
    public string Foo { get; set; }
    public string Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

查看为Main方法生成的IL:

.method private hidebysig static void Main(string[] args) cil managed
{
    .maxstack 2
    .locals init (
        [0] class ClassLibrary1.Class1 class2,
        [1] class ClassLibrary1.Class2 class3,
        [2] class ClassLibrary1.Class2 class4)
    L_0000: nop 
    L_0001: newobj instance void ClassLibrary1.Class1::.ctor()
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: ldstr "foo"
    L_000d: callvirt instance void ClassLibrary1.Class1::set_Foo(string)
    L_0012: nop 
    L_0013: newobj instance void ClassLibrary1.Class2::.ctor()
    L_0018: stloc.2 
    L_0019: ldloc.2 
    L_001a: ldstr "foo"
    L_001f: callvirt instance void ClassLibrary1.Class2::set_Foo(string)
    L_0024: nop 
    L_0025: ldloc.2 
    L_0026: stloc.1 
    L_0027: ret 
}
Run Code Online (Sandbox Code Playgroud)

您可以看到编译器已生成为class1和class2设置Foo属性的代码.它没有生成一个构造函数,它接受并设置了Foo.一个小问题,但最好了解其中的差异.