直接定义的时候初始化会使生成的IL代码更长,因为如果在直接定义的时候初始化,实际上也会在构造函数里也会进行赋值操作,并且有多少个构造函数就会执行几次赋值,所以最好的方式是在一个构造函数里初始化,然后在其他的构造函数里调用这个构造函数。
class Program { private int test = 9; public Program() { } public Program(int _value) { test = _value; } }
生成的IL代码如下:
.class private auto ansi beforefieldinit ConsoleApplication2.Program extends [mscorlib]System.Object { .field private int32 test .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 18 (0x12) .maxstack 8 IL_0000: ldarg.0 IL_0001: ldc.i4.s 9 IL_0003: stfld int32 ConsoleApplication2.Program::test //对test进行赋值 IL_0008: ldarg.0 IL_0009: call instance void [mscorlib]System.Object::.ctor() IL_000e: nop IL_000f: nop IL_0010: nop IL_0011: ret } // end of method Program::.ctor .method public hidebysig specialname rtspecialname instance void .ctor(int32 _value) cil managed { // Code size 25 (0x19) .maxstack 8 IL_0000: ldarg.0 IL_0001: ldc.i4.s 9 IL_0003: stfld int32 ConsoleApplication2.Program::test //也是对test进行赋值 IL_0008: ldarg.0 IL_0009: call instance void [mscorlib]System.Object::.ctor() IL_000e: nop IL_000f: nop IL_0010: ldarg.0 IL_0011: ldarg.1 IL_0012: stfld int32 ConsoleApplication2.Program::test IL_0017: nop IL_0018: ret } // end of method Program::.ctor
也没人说有坏处啊...你从哪儿看来的
只是看到书上说应该在构造方法里面初始化
@拖鞋王子: 哪本书?你一定看错了。。而且人家也没说直接定义的时候初始化就一定不好吧。。。
C++ 里是这样的,因为初始化就是调用构造函数
我觉得在构造器中初始化赋值,如果和构造器参数无关,那么直接在定义时初始化更好。 参见《Effective C#》
在外面定义的话,你是要定义成属性还是字段,如果是字段的话那就有封装有点冗余了,就好比.NET3.5
抛弃以前版本的写法
private int a; public int A{get;set;} //改成现在的直接 public int A{get;set;}
如果你在构造函数内部也可以在实例化类的时候动态的操作类内的数据成员(字段和属性),
同时你应该认清属性的本质,他也是方法,也是用来操作字段的,剩下的你就自己想想吧,呵呵