class A
{
}class B
{
  A a;  B()
  {
    a = new A();
  }
}和class A
{
}class B
{
  A a = new A();  B()
  {
  }
}然后调用B b = new B();
b.xxx
这两种写法效果好象是一样的,但具体有什么区别呢?
第二种方式那个 A a = new A(); 也是在创建类实例 new B() 的时候才 new 的吧?还是在编译时 new 的?哪位能给我讲讲,多谢!

解决方案 »

  1.   

    class A
    {
    }
    class B
    {
      A a;  B()
      {
        a = new A();
      }
    }这里的new A();是在创建类B的对象时new的。
    class A
    {
    }class B
    {
      A a = new A();  B()
      {
      }
    }这里 A a = new A();
    这里a作为类B的成员,并初始化。
      

  2.   

    类的实例字段变量初始值设定项相当于一个赋值序列,它在当控制进入该类的任一个实例构造函数时立即执行。变量初始值设定项按它们出现在类声明中的文本顺序执行。
    实例字段的变量初始值设定项不能引用正在创建的实例。因此,在变量初始值设定项中引用 this 是编译时错误,同样,在变量初始值设定项中通过简单名称引用任何一个实例成员也是一个编译时错误。在下面的示例中class A
    {
       int x = 1;
       int y = x + 1;      // Error, reference to instance member of this
    }
    y 的变量初始值设定项导致编译时错误,原因是它引用了正在创建的实例的成员。--->摘自MSDN
      

  3.   

    当初始化一个类时,首先将该类中的所有静态字段初始化为它们的默认值,然后以文本顺序执行各个静态字段初始值设定项。与此类似,创建类的一个实例时,首先将该实例中的所有实例字段初始化为它们的默认值,然后以文本顺序执行各个实例字段初始值设定项。在具有变量初始值设定项的静态字段处于默认值状态时,也有可能访问它们。但是,为了培养良好的编程风格,强烈建议不要这么做。示例using System;
    class Test
    {
       static int a = b + 1;
       static int b = a + 1;
       static void Main() {
          Console.WriteLine("a = {0}, b = {1}", a, b);
       }
    }
    显示此行为。尽管 a 和 b 的定义是循环的,此程序仍是有效的。它产生以下输出:a = 1, b = 2
    这是因为静态字段 a 和 b 在它们的初始值设定项执行之前被初始化为 0(int 的默认值)。当 a 的初始值设定项运行时,b 的值为零,所以 a 被初始化为 1。当 b 的初始值设定项运行时,a 的值已经为 1,因此 b 被初始化为 2。--->摘自MSDN
      

  4.   

    根据《Microsoft.net框架程序设计》的介绍,两者不同,如果使用第二种方式,编译器会在每一个构造函数的开始加上a = new A();如果函数有多个构造函数,显然会造成代码膨胀,通常为了避免这个问题,鼓励编写一个初始化函数,封装成员初始化代码,并且在构造函数中调用它。