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

时间:2010-06-13 19:14:19

标签: c#

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

2)但是如果需要在编译时确定初始化值,那么为什么我能够使用对象的引用来初始化A.b字段:

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

class B {}

谢谢

3 个答案:

答案 0 :(得分:1)

我有点困惑;田野没有这样的规则。特别是,字段显式初始化无论如何 - 通过您的代码或类型的默认值。唯一的一个例子是explit struct field initialization,其中必须在结构被认为完成之前分配所有字段。

我想知道你是否在讨论方法中变量的“明确赋值”;即。

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

这样,对于方法变量,值永远不会受到从堆栈中拾取的随机值的影响。实际上,有一个IL标记意味着本地人被擦除 - 而IIRC C#编译器包括这个标记无论如何 ...但语言规范说方法变量必须肯定是分配


对于您的示例,该字段初始化本质上成为公共构造函数代码的一部分。但你永远不会注意到它。

答案 1 :(得分:1)

  

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

绝对不能。你为什么这么想?

答案 2 :(得分:1)

如果您的意思是本书Illustrated C# 2008的这一部分,那么它就在讨论const字段的部分。编译器可以使用const字段的值替换const字段的使用,因此字段的初始化程序必须是常量。

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