假设我这样初始化一个类的成员:
class A
{
public int i=4;
public double j=6.0;
}
在这种情况下,编译器是否会生成默认构造函数?
一般来说,我知道构造函数可以初始化类实例变量的值,并且还可以执行适合该类的某些其他初始化操作。但在上面的示例中,我已经在构造函数外部初始化了i和j的值。在这种情况下,编译器是否仍会生成默认构造函数?如果是,那么默认构造函数会做什么?
假设我这样初始化一个类的成员:
class A
{
public int i=4;
public double j=6.0;
}
在这种情况下,编译器是否会生成默认构造函数?
一般来说,我知道构造函数可以初始化类实例变量的值,并且还可以执行适合该类的某些其他初始化操作。但在上面的示例中,我已经在构造函数外部初始化了i和j的值。在这种情况下,编译器是否仍会生成默认构造函数?如果是,那么默认构造函数会做什么?
在这种情况下,编译器仍会生成一个默认构造函数。构造函数处理了i和j的初始化。如果你查看IL代码,这一点是很明显的。
.class auto ansi nested private beforefieldinit A
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
L_0000: ldarg.0 // pushes "this" onto the stack
L_0001: ldc.i4.4 // pushes 4 (as Int32) onto the stack
L_0002: stfld int32 TestApp.Program/A::i // assigns to i (this.i=4)
L_0007: ldarg.0 // pushes "this" onto the stack
L_0008: ldc.r8 6 // pushes 6 (as Double) onto the stack
L_0011: stfld float64 TestApp.Program/A::j // assigns to j (this.j=6.0)
L_0016: ldarg.0 // pushes "this" onto the stack
L_0017: call instance void [mscorlib]System.Object::.ctor() // calls the base-ctor
/* if you had a custom constructor, the body would go here */
L_001c: ret // and back we go
}
您可以在官方ECMA语言标准中了解这些内容。第17.4.5章节讨论了这个具体问题,基本上说明字段将使用类型的默认值(在您的情况下分别为0或0.0)进行默认初始化,然后按照它们在源文件中声明的顺序执行值初始化。
你上面的变量初始化将首先运行。然后,你在构造函数中的任何内容将在其后运行。