【发布时间】:2017-05-25 01:51:09
【问题描述】:
//CodeSample1
//declare class fileds but not initialize them.
public class Cat
{
public int Age;
public string Name;
}
Cat aCat = new Cat();
查看结果,aCat.Age 为 0,aCat.Name 为空。
字段是如何初始化的?上面的代码只是声明了字段,并没有初始化它们。
如果您没有为您的对象提供构造函数,C# 将默认创建一个实例化对象并将成员变量设置为默认值表中列出的默认值。(来自 @987654321 @)
所以它是编译器生成的默认构造函数初始化字段。对吗?
更改代码,声明字段时初始化字段。
//CodeSample2
//declare class fields and initialize them at same time.
public class Cat
{
public int Age = 4;
public string Name = "Black";
}
Cat aCat = new Cat();
这次 Result 是 aCat.Age 是 4,aCat.Name 是“Black”。
我知道结果符合预期。但不明白它是如何工作的。
在调用对象实例的构造函数之前立即初始化字段。(来自Microsoft Document 2)
结合the Microsoft document 1 和Microsoft Document 2,CodeSample1 和 CodeSample2 应该有相同的结果(我知道这很奇怪)。
我的理解是,在 CodeSample2 中,首先将 Age 字段初始化为 4,然后调用编译器生成的默认构造函数并将年龄设置为默认值(0)。
是我误解了文件,还是文件有些错误?
如果有更准确的文件,请给我看。
【问题讨论】:
-
是什么让你认为这是真的还是假的?您的分配将被移动到编译器生成的构造函数中。尝试搜索。
-
不清楚你在问什么,请改写你的问题。
-
我会说这句话的措辞很糟糕。 “自动生成的默认构造函数”基本上和这个完全一样: public class Cat { public Cat() {} } 这个构造函数没有主动设置任何默认值,它只是没有完全触及价值。因此,如果该值尚未在任何地方初始化,它仍然具有默认值。如果它已经被初始化,它就具有它被初始化的值。
-
@BirgitVeraSchmidt - 实际上,我会说文档在这里具有误导性。语言 规范 更好地描述了这一点 - 第 10.11.4 节(用于默认构造函数)和 10.5.4 和 10.5.5(用于字段/变量初始化)