ローカル定数(Local Constants)
ローカル定数はローカル変数とよく似ていますが、大きな違いがあります。定数は初期化後、値を変更できません。
ローカル変数と同じく、定数はコードブロック内で宣言する必要があります。
定数には二つの核心的な性質があります。
- 宣言時に必ず初期値を代入する;
- 宣言後は値を変更することが許可されない。
定数の基本構文
const 型名 定数名 = 初期値;
// const:キーワード。型名の直前に記述する必要がある
// = 初期値:省略不可、必須の記述
Code language: JavaScript (javascript)
構文ルールの解説
通常のフィールドや変数宣言と比較すると、二箇所の違いが存在します。
- データ型の前に
constキーワードを追加する; - 初期値を指定しなければならず、その値はコンパイル時に確定可能である必要があります:
- 基本型のリテラル、または基本型で構成された式が一般的;
nullを代入することは可能;- オブジェクトインスタンスの参照を代入できない(オブジェクト参照は実行時に決まるため、コンパイル時定数の条件を満たさない)。
class Program
{
static void Main()
{
int a = 10; //こちらは変数
const int b = 20; //こちらは定数。見た目は変数に近い
//先頭のconstキーワードで定数として定義
a = 100; //変数は値を上書き可能
a = 200; //何度書き換えても大丈夫
// エラー
b = 300; //定数は変更不可。コンパイラがエラーを出力
//定数を使うとコードの可読性、保守性を高められます
int c; //変数宣言
c = 12; //変数は宣言と代入を分けて記述可能
//定数は宣言と初期化を分離できない
// エラー
const double d; //宣言のみ
d = 3.14; //変数なら通用する記述だが定数では禁止
}
}Code language: C# (cs)

上記二つのエラーの原因は、一つ目が定数の値を変更しようとしている点、二つ目が定数の宣言と初期化を分けている点です。定数は宣言と初期値代入を同時に行う必要があります。
classオブジェクトを定数にできるか?
定数phoneに代入する式はコンパイル時定数でなければなりません。
new Phone()はプログラム実行時にヒープメモリを確保しオブジェクトを作成するため、実行時の値となります。
C#では実行時のオブジェクト参照をconstローカル定数に代入することを認めておらず、CS0133エラーが発生します。
class Program
{
static void Main()
{
const Phone phone = new Phone();
}
}
class Phone
{
}Code language: C# (cs)

キーワード補足解説
constは修飾子ではなく、宣言構文の重要な要素であり、データ型の直前に直接記述する必要があります。
先ほど挙げたprivate、public、protectedなどが修飾子に該当します。
スコープルールとサンプル
ローカル定数のスコープルールはローカル変数と完全に同一です。メソッドまたはコードブロック内で宣言した定数は、ブロックの実行終了とともにスコープ外となり無効になります。
void ShowArea()
{
const double PI = 3.1416; // ローカル定数PIを宣言
for (int radius = 1; radius <= 5; radius++) //半径1~5の円面積を順に出力
{
double area = radius * radius * PI; // 定数PIの値を参照
Console.WriteLine($"半径: {radius}, 面積: {area}");
}
}
Code language: C# (cs)
定数PIはShowAreaメソッド内部でのみ有効で、メソッド実行完了後に破棄されます。
class Program
{
static void Main()
{
ShowArea();
}
static void ShowArea()
{
const double PI = 3.1416;
for (int radius = 1; radius <= 5; radius++)
{
double area = radius * radius * PI;
Console.WriteLine($"Radius: {radius}, Area: {area}");
}
}
}
Code language: C# (cs)

ローカル定数
Previous: 入れ子コードブロックとスコープ
Next: プログラム制御フロー