C#语法初始化字段
1.先看一个例子:
class SomeType
{
double x = 5;
public int Add(double a,double b)
{
return x;
}
}
当构造SomeType对象时他的字段将被初始化为5,这是怎样完成的呢?我们查看SomeType构造器方法(也称.ctor)的IL代码我们会看到如下的代码:
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// 代码大小 15 (0xf)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4.5
IL_0002: stfld int32 ConsoleApplication1.SomeType::x
IL_0007: ldarg.0
IL_0008: call instance void [mscorlib]System.Object::.ctor()
IL_000d: nop
IL_000e: ret
} // end of method SomeType::.ctor
我们会看到SomeType构造器首先将5赋值给x换句话说:就是C#允许我们以内敛方式初始化实例字段的简化语法,实际上都被转化成了构造器中的语法。这意味着我们需要警惕代码的膨胀效应,试想下面的类:
class SomeType
{
int x = 12;
string s = "hello world";
double d = 12.34;
byte b;
//下面是一些构造器
public SomeType()
{
}
public SomeType(int x)
{
}
public SomeType(string s)
{
}
}
//当编译器为以上三个构造器方法产生IL代码时,每一个方法的开始处都包括x,s,和d的代码,在这些代码初始化后,编译器才为各个构造器添加出现在其中的代码。
由于上面的三个构造器都对字段进行了初始化,应当避免这种情况发生。
我们应当将这些公共的初始化语句放在一个初始化构造其中,然后用其他的构造器显式的调用这个初始化构造器。这将有助于减少代码生成的尺寸。看如下的代码:
class SomeType
{
int x;
string s;
double d;
byte b;
//所有其他的构造器都必须调用下面的构造器。
//该构造器初始化了字段
public SomeType()
{
x = 12;
s = "hello world";
d = 12.34;
}
//下面的构造器首先调用了默认的构造器
public SomeType(int x):this()
{
this.x = x;
}
//下面的构造器首先调用了默认的构造器
public SomeType(string s):this()
{
this.s=s;
}
}