.NET Visual C#言語入門 > 定数
のぶ亭『プログラミングの相談窓口』 … 様々なプログラミング問題を個別対応致します |
定数
定数とは、値の変更ができない変数のことで、プログラム上で任意の値で指定しコンパイル時に確定します。フィールドの型の前に const キーワードを使用しフィールドとして宣言します。同時に初期化する必要があります。
class Calendar { const int months = 12; }
実行時に初期化できる定数値宣言を行う場合は、readonly キーワードを使用します。
定数の宣言は、
- 整数型 (sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string)、列挙型、null への参照である こと
- 同じ型の複数の定数を、同時に宣言できる
- 定数の初期化式は、(循環参照を形成しない限り)別の定数も使用できる
- static宣言はできない
- アクセス修飾子は、public、private、protected、internal、protected internalが使用できる
class Calendar { const int months = 12; const int weeks = 52; const int days = 365; const double daysPerWeek = days / weeks; const double daysPerMonth = days / months; }
定数は、静的フィールドのようにアクセスすることができます。定数をもつクラスの定数を使用する場合、クラス名、ピリオド、および定数名 を指定します。なお、使用する定数は、public宣言されていなければなりません。
//定数をもつクラスの定数を使用する classCalendar { public const int months = 12; } class etc { void test() { int months = Calendar.months; } }
注意事項
定数は、プログラムの固定化につながります。メンテナンスも含めて、様々な状況変化に柔軟に対応するためにも、不必要な定数は避けるべきです。絶対的・普遍的な定数( 月数、数学定数πなど)は、プログラム上に埋め込んでも問題ありませんが、それ以外は、たとえ定数的に見えても変わる可能性があります。
- プログラム上で、普遍的な定数以外は定数としない
- constでなく、インスタンス化時点で初期化ができるreadonlyを使用する
実用的なアプリケーションでは、実行時にファイルやレジストリなどから固定値を取得します。そうすることで、 突然の変更にもファイルやレジストリの修正で柔軟な対応(プログラムの修正を行わない)ができます。
constとreadonlyの比較
const readonly クラス・メンバ変数およびローカル変数 クラス・メンバ変数のみ 常に静的変数 static変更可能 宣言時にのみ初期化可能 コンストラクタ内で変更可能 コンパイル後はリテラルと同等 コンパイル後は変数と同等 new不可 new可能
class ReadOnly { readonly int ID = 0; public A(int Value) { this.ID = Value; // コンストラクタ内で変更可能。 } public void MethodFunc(int Value) { int ID = this.ID; // 読み取りは可能。 this.ID = Value; // 書き込み不可。エラー! } }