x1和x2的初始化有什么不同吗?
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var x1 = new C { };
var x2 = new C ();
}
}
public class C
{
public int A;
}
}
答案 0 :(得分:7)
在你的例子中,没有区别。两者都调用默认构造函数而不传入任何值。 {}是对象初始值表示法,它允许您设置未通过构造函数传递的公共属性的值。
实施例。使用以下类,PropertyA通过构造函数传入,PropertyA,PropertyB,PropertyC可在对象上设置。
class TestClass
{
public string PropertyA { get; set; }
public string PropertyB { get; set; }
public string PropertyC { get; set; }
public TestClass(string propertyA)
{
propertyA = propertyA;
}
}
如果您需要设置所有值,则可以执行此操作
var test1 = new TestClass("A");
test1.PropertyB = "B";
test1.PropertyC = "C";
或者使用对象初始化程序格式的等效项将是
var test2 = new TestClass("A") {PropertyB = "B", PropertyC = "C"};
答案 1 :(得分:4)
不,他们编译为相同的代码
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 14 (0xe)
.maxstack 1
.locals init ([0] class ConsoleApplication2.C x1,
[1] class ConsoleApplication2.C x2)
IL_0000: nop
IL_0001: newobj instance void ConsoleApplication2.C::.ctor()
IL_0006: stloc.0
IL_0007: newobj instance void ConsoleApplication2.C::.ctor()
IL_000c: stloc.1
IL_000d: ret
} // end of method Program::Main
然而x2
是处理无参数构造函数时的标准编码样式,而不是使用对象初始值设定项初始化任何值。
答案 2 :(得分:3)
大括号{}
用于对象或集合初始化:
new C() { Property1 = "Value", Property2 = "etc..." };
应该注意,这里()
可以省略,因为它是默认的构造函数。因此,new C{}
基本上是new C() {}
。