这真是一个简单的问题.我一直在.NET 3.5(C#)中使用新类型的构造函数,但我想知道它们被称为什么,如果它们有一个名字:)
我正在谈论的构造函数是这样的:
Customer c = new Customer()
{
Name = "Bo"
};
Run Code Online (Sandbox Code Playgroud)
正如其他人已经指出的那样,它们被称为对象初始化器.
但是,它们不是构造函数,您不应该像这样引用它们.
请考虑以下代码:
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.一个小问题,但最好了解其中的差异.
| 归档时间: |
|
| 查看次数: |
1117 次 |
| 最近记录: |