何らかの理由で、フィールドにはオーバーヘッドが関連付けられていると常に想定してきました。これは、フィールドが初期化されているreadonly
かどうかを追跡する CLR と考えられていました。readonly
ここでのオーバーヘッドは、状態を追跡するための余分なメモリ使用量と、値を割り当てるときのチェックです。
おそらく、フィールドがコンストラクター内またはフィールド宣言自体内でのみ初期化できることを知らなかったためreadonly
、実行時チェックなしでは、さまざまな方法で複数回割り当てられていないことを保証できないため、これを想定しましたメソッド。しかし、今ではこれを知っています。C# コンパイラで簡単に静的にチェックできますよね? そうですか。
もう1つの理由は、の使用がパフォーマンスに「わずかな」影響を与えることを読んだことがありますreadonly
が、彼らはこの主張に関与したことがなく、この件に関する情報を見つけることができないため、私の質問です. 実行時チェック以外にパフォーマンスにどのような影響があるかはわかりません。
3 番目の理由は、それreadonly
がコンパイルされた IL に として保存されていることを確認したinitonly
ことです。したがって、この情報が IL に含まれる理由はreadonly
、フィールドが外部に割り当てられないという C# コンパイラによる保証にすぎない場合はどうなるでしょうか。コンストラクタまたは宣言?
一方、readonly int
CLR が例外をスローすることなく、スルー リフレクションの値を設定できることがわかりました。これreadonly
は、ランタイム チェックの場合は不可能です。
だから私の推測は次のとおりです。「読み取り専用」はコンパイル時の機能にすぎません。誰でもこれを確認/拒否できますか? もしそうなら、この情報が IL に含まれる理由は何ですか?