2010-06-13 59 views
2

1)为什么必须在编译时确定字段成员的初始化值?为什么必须在编译时确定字段成员的初始化值?

2)但是,如果初始化值需要在编译时被确定,那么为什么我只能用一个参考对象初始化A.b场:

class A 
{ 
    B b = new B(); 
} 

class B {} 

谢谢

+0

我不确定你的意思。我刚刚用DateTime.Now初始化一个类成员,它工作正常,甚至认为DateTime.Now不能在编译时计算。 – apoorv020 2010-06-13 19:42:50

回答

1

我有点困惑;田地没有这样的规则。特别是,无论如何,都会明确初始化字段 - 无论是通过您的代码,还是通过类型的默认值。唯一的角落案例是explit结构体域初始化,其中必须在结构被认为完成之前分配所有的域。

不知您是否在谈论变量的“明确赋值”方法;即

void Foo() { 
    int i; 
    Console.WriteLine(i); // not valid; i not assigned 
    i = 1; 
    Console.WriteLine(i); // would be value 
} 

这使得对于方法变量来说,这些值永远不会受到从栈中拾取的随机值的影响。实际上,有一个IL标记,表示当地人被擦除 - 而IIRC C#编译器包含这个标记无论如何 ...但语言规范说方法变量必须必须明确分配。


在你例子中,那场初始化本质成为共同构造函数代码的一部分。但你永远不会注意到它。

+0

“在你举例的情况下,该字段初始化本质上成为公共构造函数代码的一部分。”你是否暗示构造函数初始化A.b域? – flockofcode 2010-06-13 19:35:36

+1

@flock:是的,这就是他的意思。赋值语句实际上被移入构造函数中。用Ildasm.exe轻松查看 – 2010-06-13 20:03:58

+0

谢谢大家的帮助 – flockofcode 2010-06-13 20:10:34

1

1)为什么必须在编译时确定字段成员的初始化值?

它不能。为什么你这么想 ?

+0

你为什么这么想?如果你有一个字段初始化程序'int i = 7;',它可以在编译时确定,编译器会给出一个错误,说它在编译时不能确定吗? – 2010-06-13 19:34:11

+0

从书籍Illustrated C#2008:“字段初始化值必须在编译时可确定” – flockofcode 2010-06-13 19:34:46

+0

我并不完全确定,但似乎不是投了票,我不小心投了你票。我很抱歉,如果是这种情况 – flockofcode 2010-06-13 19:40:39

1

如果您是指Illustrated C# 2008这本书的这一部分,那么它在该部分讨论const字段。编译器可以用const字段的值替换const字段的使用,所以字段的初始值必须是常量。

原始帖子中的字段不是常量。因此限制不适用于此。

+0

“如果您是指Illustrated C#2008这一部分的内容,那么它在关于const字段的部分中说:”不,您正在讨论的是第71页以上。我的报价取自第50页,名称为Explicit and Implicit field initialization – flockofcode 2010-06-13 20:09:59

+1

@flockofcode然后它是错误的。在http://apress.com/book/errata/778提交更正 – 2010-06-14 15:00:25

相关问题