const
なぜ C# がクラスまたはメソッド レベルでサポートしないのか、しばらく疑問に思っていました。Jon Skeet が長い間不変性のサポートを望んでいたことは知っています。関数 const の C++ 構文を使用すると、そのサポートが得られると考えています。クラス レベルで const キーワードを追加することで、完全なサポートが得られます。
さて、私の質問は、C# チームがこの種のサポートを開発しなかった理由は何ですか?
CLRを変更する必要なく、コンパイル時のチェックまたは属性を使用してすべてを作成できると思います。コードがリフレクションを通じて const の動作をオーバーライドできることは気にしません。
これを想像してください:
const class NumberContainer
{
public int Number { get; }
}
.. このようなクラスは、構築時にしか設定できないため、int を受け取るコンストラクターが必要になります。
もう 1 つの例は、メソッド レベルの const です。
public int AddNumbers(NumberContainer n1, NumberContainer n2) const
{
return n1.Number + n2.Number;
}
const レベルのメソッドは、自身のクラスまたは渡された参照型のインスタンスの状態を変更できないようにする必要があります。また、const レベルの関数は、そのスコープ内にある間だけ、他の const レベルの関数を呼び出すことができました。
ラムダとデリゲートがすべてを達成するのを困難にする (または不可能にする) かどうかはよくわかりませんが、言語とコンパイラの設計の経験が豊富な人が教えてくれると確信しています。
Steve B がコメントで指摘したように、 の存在により、 const との間はほぼ同じになるためreadonly
、物事が少し複雑になりますが、コンパイル時に値を決定することはできません。とレベリングを行うこともできると思いますが、それではややこしすぎるのではないでしょうか?readonly
runtime
readonly
const
readonly
では、これを実装しない理由は何ですか?使いやすさの問題 (C++ の const を理解することは、通常、新規ユーザーには非常に困難です)、言語設計の問題 (実行できません)、または単純に優先順位の問題 (不変性に関する話題の時代は終わりました) ..?