首页 新闻 会员 周边 捐助

为什么一个类的变量要在构造方法里初始化,直接定义的时候初始化有什么坏处

0
[已解决问题] 解决于 2013-10-22 23:10

为什么一个类的变量要在构造方法里初始化,直接定义的时候初始化有什么坏处

拖鞋王子的主页 拖鞋王子 | 初学一级 | 园豆:38
提问于:2012-06-25 14:57
< >
分享
最佳答案
0

直接定义的时候初始化会使生成的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
奖励园豆:5
Ivy Zhang | 菜鸟二级 |园豆:207 | 2012-06-25 22:53
其他回答(4)
0

也没人说有坏处啊...你从哪儿看来的

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-06-25 15:59

只是看到书上说应该在构造方法里面初始化

支持(0) 反对(0) 拖鞋王子 | 园豆:38 (初学一级) | 2012-06-25 16:09

@拖鞋王子: 哪本书?你一定看错了。。而且人家也没说直接定义的时候初始化就一定不好吧。。。

支持(0) 反对(0) 水牛刀刀 | 园豆:6350 (大侠五级) | 2012-06-25 16:11
0

C++ 里是这样的,因为初始化就是调用构造函数

cici.fan | 园豆:46 (初学一级) | 2012-06-25 16:27
0

我觉得在构造器中初始化赋值,如果和构造器参数无关,那么直接在定义时初始化更好。 参见《Effective C#》

Orange Cheng | 园豆:204 (菜鸟二级) | 2012-06-26 15:00
0

在外面定义的话,你是要定义成属性还是字段,如果是字段的话那就有封装有点冗余了,就好比.NET3.5

抛弃以前版本的写法

private int a; 
public int A{get;set;}
//改成现在的直接
public int A{get;set;}

如果你在构造函数内部也可以在实例化类的时候动态的操作类内的数据成员(字段和属性),

同时你应该认清属性的本质,他也是方法,也是用来操作字段的,剩下的你就自己想想吧,呵呵

Halower | 园豆:1723 (小虾三级) | 2012-06-28 22:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册