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; } }
|
请发表评论