我是C#的新手,只是有关默认构造函数的一个问题。 我正在读一本书,上面写着
默认构造函数确保将类的所有字段数据设置为适当的默认值
假设我们有以下课程:
class Employee
{
public string name;
public int empID;
public Employee(string name) {
this.name = name;
}
}
...
static void Main(string[] args){
Employee emp = new Employee("Michael");
Console.WriteLine(emp.empID);
}
,输出为0,表示empID
已被初始化为其默认值。
但是我没有在构造函数中初始化empID
,也没有默认的构造函数(由给定的构造函数覆盖),那么为什么empID
仍然被初始化?
快速更新:
对于那些说不会编译的人,因为我最初复制了错误的内容,所以现在应该可以使用
再次,我的问题是,为什么教科书上说默认构造函数确保将类的所有字段数据都设置为适当的默认值,但在我的情况下仍然有不涉及默认构造函数,而empID仍具有其默认值吗?
答案 0 :(得分:1)
首先,它不会编译,因为您没有定义默认构造函数-当您使用参数定义构造函数时,除非您明确定义默认构造函数,否则它将不可用。因此,您需要使用new Employee("some name");
第二,empID
的默认值为0
,因此可以预期,在使用默认construcotr后(如我所说,这是不可用的),其值为0
。>
通常,值类型的默认值是0
(当我们谈论数字类型时,对于其他值类型,例如DateTime
,请参见文档),对于引用类型,其默认值是null
。 / p>
答案 1 :(得分:1)
documentation for C# constructors实际上措辞不佳。它说:
如果类没有构造函数,则会自动生成无参数构造函数,并且将使用默认值来初始化对象字段。例如,将int初始化为0。
这里的“ 和”似乎表明只有在不提供构造函数的情况下才会发生这种情况,然后...会发生什么? ...如果您提供构造函数?
答案是所有实例字段都已初始化。不管是否存在开发人员定义的构造函数,默认值还是其他值。
实际上不是构造函数将字段初始化为其默认值,即。 0表示数字字段,null
表示引用,等等。
这是由new
运算符完成的,在涉及构造函数之前。
如果您有此类:
public class Test
{
public int Field;
}
然后没有构造函数将任何内容专门存储到Field
字段中,当为实例分配内存时,它将初始化为0。
相反,如果您具有此构造函数:
public Test()
{
Field = 42;
}
或者您具有以下字段声明:
public int Field = 42;
(相当于同一件事)
然后,当您构造这种类型的实例时,会发生以下情况:正在分配内存,并将它们设置为0 ,这会将Field
的初始值设置为0,并且然后将调用构造函数,该函数会将字段设置为42。
答案 2 :(得分:0)
在初始化一个类的实例时,编译器需要知道它需要为该类型实例在内存中分配的空间,并且可以通过计算实例变量或数据成员字段的空间,然后计算类型实例的空间来实现相同的目的调用构造函数以设置对象的初始状态。
在构造引用类型对象时,为对象分配的内存总是在调用类型的实例构造函数之前清零。 构造函数未明确覆盖的任何字段都必须保证值为0或null。
下面是我创建的示例类,它没有默认值或参数较少的构造函数。
public class PersonWithoutDefault
{
private string name;
public PersonWithoutDefault(string name)
{
this.name = name;
}
}
下图显示了使用ildasm的反汇编代码。没有默认值或没有参数的构造函数。