C#_ const と readonly の違い

読み取り専用とだけしか知らなかった。

 

const readonly
ローカル変数にも使える。 クラスのメンバー変数のみ。
変数のように扱える定数 読み取り専用の代入不可な変数
静的変数と同じ扱い
( 暗黙的 static )。
static の有無を変えられる
宣言時にのみ初期化可能。
むしろ宣言時に値を代入する必要がある。
コンストラクタ内で値を書き換え可能
コンパイル結果はリテラルと同等
( コンパイル時に値が埋め込まれる )
コンパイル結果は変数と同等
new で生成するものには使えない
( C# の組み込み型のみ )
new 可能値型参照型使える
switch文やデフォルト引数に使える。 switch文やデフォルト引数には使えない。
readonly より実行速度が速い。 定数であるconstよりは、僅かに
実行速度が遅い。

 

const

コンパイル結果がリテラルを使った結果と同じく、
プログラム中に直接値が埋め込まれてしまう為、
参照側 ( クラス利用側 ) のコードもコンパイルする必要が生じる

円周率など不変で絶対に変わることのない値以外は、
public const なメンバー変数にすべきではない。
private や ローカル変数に対する const は OK。

リテラル
ソースに直接記述するデータ。

参照側 ( クラス利用側 ) のコードも再コンパイルする必要が生じる。」
は、下記と同じ意味かと。

const は自分が作ったアセンブリをクラスライブラリとして配布してしまうと、
const の値を変えた場合は、それを使う側のアプリは
リビルドしなければ反映されない。
dll 差し替えだけでは反映されないので注意。

 

readonly

readonly の注意点は、構造体クラスなどの複合体に使う時
整数など基本的な型に対して使う分には特に問題は起きない。

 

 

こちらから。
http://ufcpp.net/study/csharp/sp_const.html#readonly
http://ufcpp.net/study/csharp/resource/readonlyness/
https://qiita.com/ShirakawaMaru/items/97545b40202bb6ba2ca4
https://qiita.com/tanakaworld/items/eda69da263e24adfa07d

 

以上。

--Memo--
メンバ変数 ( フィールド ):クラスが持つ変数
ローカル変数:メソッドが持つ変数