11

このスニペットでは:

class ClassWithConstants
{
    private const string ConstantA = "Something";
    private const string ConstantB = ConstantA + "Else";

    ...

}

で終わるリスクはありConstantB == "Else"ますか?それとも割り当ては直線的に行われますか?

4

3 に答える 3

37

あなたは常に「SomethingElse」を取得します。これは、ConstantB が ConstantA に依存しているためです。

行を切り替えても同じ結果が得られます。コンパイラは、ConstantB が ConstantA に依存していることを認識しており、それを部分クラスで記述した場合でも、それに応じて処理します。

完全に確認するには、VS コマンド プロンプトを実行して ILDASM を呼び出すことができます。実際にコンパイルされたコードが表示されます。

さらに、次のことを実行しようとすると、コンパイル エラーが発生します。

private const string ConstantB = ConstantA + "Else";
private const string ConstantA = "Something" + ConstantB;

エラー: 'ConsoleApplication2.Program.ConstantB' の定数値の評価には、循環定義が含まれています。この種のことは、コンパイラがその依存関係を認識していることを証明しています。


追加: Jon Skeetが指摘した仕様参照:

これは、C# 3 仕様のセクション 10.4 で明示的に言及されています。依存関係が循環的な性質でない限り、定数は同じプログラム内の他の定数に依存することが許可されています。コンパイラは、定数宣言を適切な順序で評価するように自動的に調整します。


于 2009-08-17T13:20:58.163 に答える
3

文字列リテラルしかないため、この文字列の連結はコンパイル時に行われます (コンパイラの構造に関する文献で定数の折りたたみを検索してください)。

ご心配なく。

于 2009-08-17T13:05:37.313 に答える
2

常に「SomethingElse」と評価される必要があります

于 2009-08-17T13:06:09.933 に答える