6

C#不允许实例字段初始化程序引用另一个字段。例如,此代码无效:

class A
{
 string s1 = "";
 string s2 = s1;
}

因为“s2”引用“s1”。

但为什么这是不允许的?

我的第一个想法是C# 规范不保证任何初始化顺序,但根据规范,顺序是声明的顺序:

变量初始化器按照它们在类声明中出现的文本顺序执行。

那么,如果顺序是确定性的,那么这种代码的缺陷是什么?

在此先感谢您的帮助。

编辑 :

根据Hps0xA3Peter的回答:

  • 继承场景中的初始化顺序可能非常混乱,

  • 实现这样的功能需要编译器开发团队提供一些资源,但收益甚微,

  • 出于逻辑原因,不可能使用方法或属性(感谢Peter),因此为了保持一致性,字段也是如此。

4

2 回答 2

5

我不确定一个字段,但拒绝字段初始化程序访问属性或方法似乎是合理的。例如:

class A
{
    string s1 = GetString();
    string s2 = this.MyString;
    string s3 = "test";

    public string GetString()
    {
        // this method could use resources that haven't been initialized yet
    }

    public string MyString
    {
        get { return s3; } 
        // this field hasn't been initialized yet 
        // (okay, strings have a default value, but you get the picture)
    }
}
于 2010-11-26T14:22:25.153 回答
2

编译器可能检查字段的顺序,然后如果先前已声明另一个字段,则允许初始化。

除了重新排序或重构会破坏代码的陷阱之外,为什么编译器会变得不必要地复杂。资源有限,编译器团队可能更喜欢处理具有更高优先级的功能。

于 2010-11-26T14:16:02.527 回答