次のコードが C#.NET デザイナーで許可されていない理由の説明を探していることに非常に興味があります。
const foo f = new foo();
次のエラーメッセージが表示されます。
「f」は「ConsoleApplication1.foo」タイプです。文字列以外の参照型の const フィールドは、null でのみ初期化できます。
質問は次のとおりです。なぜですか。誰かがこのconst
要件を説明できますか?
前もって感謝します。
aはコンパイル時const
に解決できるものでなければならないためです。
new foo();
実行時に実行されます。
おそらく、readonly
キーワードを使用して、コンストラクターの外で初期化できないようにする必要があります。
private readonly foo f = new foo();
const
C# の a はコンパイル時の定数でなければならないためです。したがって、const
(ほとんどの参照型で) 有効なオプションは のみですnull
。
1 つの例外はstring
、文字列リテラルに割り当てることができる場合です。
// allowed because string literals are compile-time
private const string Message = "Hello World";
フィールドを持つことができますreadonly
。これにより、フィールドを初期化子またはコンストラクターでのみ設定できます。本質的に、これは に似てconst
いますが、実行時に決定され、static
またはインスタンスになる可能性があります (すべてのconst
フィールドはstatic
自動的に行われます)。
ただし、参照とは参照readonly
が読み取り専用であることを意味するだけであり、参照先のオブジェクトも読み取り専用であることを意味するわけではないことに注意してください(もちろん、オブジェクトが のように設計上不変でない限り)。string
例えば:
private readonly List<string> validStrings = new List<string> { "Apple", "Orange", "Pear" };
validStrings
上記はですが、新しい参照に割り当てて readonly
変更できないことを意味するだけです。ただし、オブジェクトが変更可能な場合は、参照するものを変更できます。validStrings
// allowed, you can change what it refers to
validStrings.Clear();
// disallowed, cannot change what the reference refers to outside of constructor
validStrings = new List<string> { "Other", "Stuff" };
お役に立てれば...
const は、値がコンパイル時に既知であることを示します。new はオブジェクトを割り当てるため (プログラムが実行されていない場合は不可能です)、新しいオブジェクトに const を設定することはできません。次のように、やや似たようなことを達成できます。
static readonly Foo foo = new Foo()
実際には、エラー テキストは、フィールド (クラス (または構造体) に属するメソッドの外部で宣言) ではなく、ローカル変数 (メソッド内で宣言) であるため、混乱を招きます。
const
他の人が言うように、 以外の参照型には役に立たないため、削除する必要がありstring
ます。