C#の:このフィールドの割り当ては安全ですか?
-
18-09-2019 - |
質問
このスニペットでます:
class ClassWithConstants
{
private const string ConstantA = "Something";
private const string ConstantB = ConstantA + "Else";
...
}
ConstantB == "Else"
で終わるのリスクはありますか?またはassigmentsは直線的に起こるのか?
解決
あなたはいつも "SomethingElse" を取得します。 ConstantBはコンスタンツァに依存するからである。
あなたも、ラインを切り替えることができますし、同じ結果を得るでしょう。コンパイラはConstantBあなたは部分クラスでそれを書く場合でも、コンスタンツァに依存し、それに応じて処理することを知っています。
は、VSコマンドプロンプトを実行し、ILDASMを呼び出すことができ、完全に確認します。そこには、実際にコンパイルされたコードを見ることができます。
:あなたは次の操作を実行しようとした場合、また、コンパイルエラーが発生します
private const string ConstantB = ConstantA + "Else";
private const string ConstantA = "Something" + ConstantB;
のエラーの「ConsoleApplication2.Program.ConstantB」の定数値の評価は、円形の定義を含み これは一種のコンパイラは、その依存関係を知っていることを証明ます。
<時間>を追加します:
:スペック参照は、ジョンスキートをhref="https://stackoverflow.com/users/22656/jon-skeet">これは、明示的にC#3の仕様のセクション10.4に記載されています。 定数は限り依存性が円形の性質のものではないのと同じプログラム内の他の定数に依存することを許可されています。コンパイラが自動的に適切な順序で定数宣言を評価するために配置します。
<時間>他のヒント
唯一の文字列リテラルがあるので、
この文字列の連結は、(コンパイラの建設の文献にの折りたたみの定数を検索)コンパイル時に起こります。
それについては心配しないでください。
これは、常に "SomethingElse"
に評価する必要があります所属していません StackOverflow