ローカル定数

ローカル定数(Local Constants)

ローカル定数はローカル変数とよく似ていますが、大きな違いがあります。定数は初期化後、値を変更できません

ローカル変数と同じく、定数はコードブロック内で宣言する必要があります。

定数には二つの核心的な性質があります。

  1. 宣言時に必ず初期値を代入する
  2. 宣言後は値を変更することが許可されない

定数の基本構文

const 型名 定数名 = 初期値;

// const:キーワード。型名の直前に記述する必要がある
// = 初期値:省略不可、必須の記述
Code language: JavaScript (javascript)

構文ルールの解説

通常のフィールドや変数宣言と比較すると、二箇所の違いが存在します。

  1. データ型の前にconstキーワードを追加する;
  2. 初期値を指定しなければならず、その値はコンパイル時に確定可能である必要があります:
    • 基本型のリテラル、または基本型で構成された式が一般的;
    • 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)

定数PIShowAreaメソッド内部でのみ有効で、メソッド実行完了後に破棄されます。


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)
定数PIのスコープ(赤色領域)。変数と同じく、自身を囲む上位のコードブロック{}に制限され、PIの上位ブロックはメソッド本体の波括弧です。

ローカル定数

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です