6

C#では、インスタンス フィールド初期化子が別のフィールドを参照することはできません。たとえば、このコードは無効です:

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

「s2」は「s1」を参照しているためです。

しかし、なぜこれが許可されていないのでしょうか?

私の最初の考えは、C#の仕様は初期化順序を保証していないということでしたが、仕様によれば、順序は宣言の順序です。

変数初期化子は、クラス宣言に現れるテキストの順序で実行されます。

順序が決定論的である場合、この種のコードの落とし穴は何でしょうか?

よろしくお願いします。

編集 :

Hps0xA3、およびPeterの回答によると:

  • 継承シナリオでの初期化の順序は非常に混乱する可能性があります。

  • そのような機能を実装するには、コンパイラ開発チームからのリソースが必要になりますが、メリットはほとんどありません。

  • 論理的な理由でメソッドやプロパティを使用することはできません ( 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 に答える