ホームに戻る
出典 :
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 句への適用 可 不可 不可
バージョニング問題 発生する 発生しない 発生しない