定数


不変の値

開発効率と保守性を向上する目的で、私たちは「定数」を定義できます
定数とは、コンパイル時に展開することができるリテラルを表します

定数は変数と異なり、プログラム中で常に不変の値を表します
つまり、リテラルのエイリアスであり、常にその値を保証してくれるのです
定数を宣言するには const キーワードを指定します

[attributes] [modifiers] const type declarators;

attributes には属性、modifiers には修飾子を指定します
type は定数の型、declarators は定数宣言子を記述します
定数宣言子は必ず次の形を持ちます

identifier = constant-expression

identifier は定数の識別子、constant-expression は定数式を指定します
constant-exporession の評価結果が、定数の値となります

定数は静的なので、実行時に初期化されることはありません
そして、定数は一見変数のように扱えますが代入はできません
定数の値は常に不変であり、定数はそのリテラルのエイリアス的存在なのです
class Test {
	public const string strKitty = "Kitty on your lap";

	static void Main() {
		const string strName ="Rena";
		//strName = "Yuki";		//代入できない
		//strKitty = "Di Gi Charat";	//代入できない

		System.Console.WriteLine(strKitty);
		System.Console.WriteLine(strName);
	}
}
strKitty と strName はそれぞれ定数です
これらの値はコンパイル時に評価され、リテラルの別名として働きます
定数の値は基本的にリテラルに等しく、式中に指定することは可能ですが
定数の内容を変更することはできません


読み取り専用

定数はリテラルの別名的存在であると説明しました
すなわち定数は宣言時にその値が確定していなければなりません

しかし、ディスプレイの解像度などクライアントコンピュータの情報は
一度取得すれば定数的に扱えるべきでありながら、実行時までその値はわかりません
このような場合、定数ではなく読み取り専用を用います

読み取り専用は定数ではなく変数ですが、一度書き込むともう変更はできません
読み取り専用フィールドは初期化子またはコンストラクタで初期化します
読み取り専用を宣言するには readonly キーワードを使用します

readonly はフィールドにのみ指定できます
また、読み取り専用は定数とは異なりインスタンスを持つことができます
そのため、定数のように静的に扱いたい場合は静的フィールドに指定し
静的コンストラクタで読み取り専用フィールドを初期化するという方法が取られます
class Test {
	public static readonly string strKitty;

	static Test() {
		strKitty = "Kitty on your lap";
	}

	static void Main() {
		//strKitty = "Di Gi Charat";	//代入できない
		System.Console.WriteLine(strKitty);
	}
}
strKitty は読み取り専用なので、静的コンストラクタでこれを初期化しています
もちろん、これ以外の場所では初期化子を除いて初期化できないので
他のメソッドから見れば、定数のように扱うことができるのです


const

[attributes] [modifiers] const type declarators;

定数を宣言します
これを指定した場合、常に静的な定数として動作します

attributes - フィールドの属性を指定します
modifiers - フィールドの修飾子を指定します
type - 定数の型を指定します
declarators - 定数宣言子群を指定します

readonly

読み取り専用フィールドであることを宣言します
このフィールドはコンストラクタ、または変数初期化子でのみ初期化することができます
それ以外では、値を変更することを許されません



前のページへ戻る次のページへ