这两种写法效果好象是一样的,但具体有什么区别呢?
第二种方式那个 A a = new A(); 也是在创建类实例 new B() 的时候才 new 的吧?还是在编译时 new 的?哪位能给我讲讲,多谢!
...全文
1578打赏收藏
请问如下两种写法有什么区别?
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 的?哪位能给我讲讲,多谢!
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。
类的实例字段变量初始值设定项相当于一个赋值序列,它在当控制进入该类的任一个实例构造函数时立即执行。变量初始值设定项按它们出现在类声明中的文本顺序执行。
实例字段的变量初始值设定项不能引用正在创建的实例。因此,在变量初始值设定项中引用 this 是编译时错误,同样,在变量初始值设定项中通过简单名称引用任何一个实例成员也是一个编译时错误。在下面的示例中
class A
{
int x = 1;
int y = x + 1; // Error, reference to instance member of this
}
y 的变量初始值设定项导致编译时错误,原因是它引用了正在创建的实例的成员。