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;
        }
    }

posted @ 2011-06-15 08:57  yxf2011  阅读(1337)  评论(0编辑  收藏  举报