ホームに戻る
出典 :
constとreadonlyとstatic readonly、それぞれの特徴と使い分け方 - Qiita
関連 :
[C/C++]const修飾の使い方 [C/C++]static修飾の使い方
目次 :

C#におけるconstとreadonly

いずれも修飾された変数を読み取り専用(書き換え不可)とする効果を持つが、振舞は厳密には異なる。

const

値がコンパイル時に確定する定数(コンパイル時定数)を宣言する際に用いる。
即ち、コンパイル時に値が確定するプリミティブ型、または文字列型のみをconst修飾できる。
以下の特徴を有する。

readonly

値を実行時に取得する読み取り専用変数(実行時定数扱い)を宣言する際に用いる。
即ち実行時まで値が確定しないが、初期化後は不変となる。
class Hoge { // readonly 変数を宣言 public readonly int Piyo; public readonly Dog taro; Hoge (int huga) { // コンストラクタ内で書き換え可能 this.Piyo = huga; this.taro = new Dog(); } void Func(int mohu) { int muga = this.Piyo; // readonly 変数を上書きすることはできない ⇒ コンパイルエラー this.Piyo = mohu; } }

static readonly

定数値が必要であるが、その値の型がconst宣言で使用できない(プリミティブ型でも文字列型でもない)場合、またはその値をコンパイル時に計算できない場合に
(constの代替として)static readonly修飾を用いることで、定数値をstatic化できる。
constとは異なりバージョニング問題が発生しないため、static readonlyの使用が推奨されている。

まとめ・使い分けるポイント

const readonly static readonly
値の確定時期 コンパイル時 実行時 実行時
帰属先 クラス (static) インスタンス クラス (static)
適用可能な型 数値型、文字列 (string) 制約なし 制約なし
コンストラクタでの初期化 不可
デフォルト引数、case 句への適用 不可 不可
バージョニング問題 発生する 発生しない 発生しない