C#

C# | const定数:活用ガイド

2024年5月8日

本ページはプロモーションが含まれています

C#const定数アイキャッチ画像

const 定数はプログラム内で変更されない値を定義する際に便利であり、コードの可読性と保守性を向上させる役割を果たします。

以下の例では、Pi と DaysInAWeek が const 定数として定義されています。

これらの値はプログラム全体で不変であり、その値を使用する全ての箇所で同じ値が使われます。

public class ConstantsExample
{
    public const double Pi = 3.14159;
    public const int DaysInAWeek = 7;

    public static void Main()
    {
        // 定数の使用例
        double radius = 5.0;
        double area = Pi * radius * radius;
        Console.WriteLine($"半径 {radius} の円の面積: {area}");

        int weeks = 52;
        int totalDays = weeks * DaysInAWeek;
        Console.WriteLine($"1年間の日数: {totalDays}");
    }
}

const(定数)に関する主な疑問や問題点について、いくつかのポイントを挙げてみます。

  1. constの利用場面: constで宣言された変数は再代入できないことが基本ですが、その意味と実際の利用場面について。
  2. constの利用できない場面:constが使えない場面とは。
  3. constとreadonlyの違い: constとreadonlyの違いについての理解。

この記事ではこれらについても詳しく解説します。

const定数とは

const キーワードは、定数を宣言するために使用されます。

定数は、プログラムの実行中に変更されることのない値を表します。

const を使用して宣言された定数は、実行時に変更されることがありません。

const定数の宣言と初期化の方法

ポイント

constキーワードを使用して定数を宣言する際には、宣言と同時に初期化する必要があります。
定数は宣言後に再代入することができないため、宣言時に初期値を与えることが必須となります。

そして、それ以降はその値を変更することができません。

const int CircleRadius = 5;
const double Pi = 3.14159;
const string Message = "Hello, world!";

const定数の利用場面

constの使用できる場面は以下のようになります。
それぞれを詳しく見ていきます。

  • クラスレベル
  • メソッド内
  • 構造体内

クラスレベル

クラス内で定数を宣言することができます。
これらの定数は、そのクラスのインスタンスごとではなく、クラス自体に関連付けられます。

public class MyClass
{
    // クラスレベルでの const 宣言
    public const int MaxValue = 100;

    public void ShowMaxValue()
    {
        Console.WriteLine(MaxValue); // 使用例
    }
}

メソッド内

メソッド内で定数を宣言することができます。
これらの定数は、メソッドが呼び出されるたびに再度初期化されます。

public void MyMethod()
{
    const int LocalConstant = 10;
    Console.WriteLine(LocalConstant); 
}

構造体内

構造体内で定数を宣言することができます。
これらの定数は、構造体のインスタンスごとではなく、構造体自体に関連付けられます。

public struct MyStruct
{
    // 構造体内での const 宣言
    public const int DefaultValue = 50;

    public void ShowDefaultValue()
    {
        Console.WriteLine(DefaultValue); // 使用例
    }
}

const定数の使用できない場面

constの使用できない場面は以下のようになります。
それぞれ詳しく見ていきます。

  • メソッドの戻り値
  • プロパティ

メソッドの戻り値

メソッドの戻り値として const を使用することはできません。
メソッドは実行時に値を返す必要があり、コンパイル時に値が決まっている const はその要件を満たしません。

using System;

public class Example
{
    // const をメソッドの戻り値として使うことはできません
    public const int GetValue() // コンパイルエラー
    {
        return 10; // コンパイルエラー
    }
}

class Program
{
    static void Main(string[] args)
    {
        // メソッドの戻り値に const を使用した場合のエラー
        // コンパイルエラー: 'const'メンバーはメソッドとしては無効
        int value = Example.GetValue(); // コンパイルエラー
        Console.WriteLine(value);
    }
}

プロパティ

プロパティの定義においても const を使用することはできません。
プロパティはフィールドにアクセスするためのメソッドであり、定数値を返すことができないためです。

using System;

public class MyClass
{
    // const をプロパティに使用することはできません
    public const int MyProperty { get; } = 42; // コンパイルエラー
}

class Program
{
    static void Main(string[] args)
    {
        // プロパティに const を使用した場合のエラー
        // コンパイルエラー: 'const' プロパティは無効です
        Console.WriteLine(MyClass.MyProperty); // コンパイルエラー
    }
}

constとreadonlyの違い

constとreadonlyの違いを簡潔に説明します。

  • const
    • 定数を宣言するためのキーワード。
    • 初期化時に必ず値を設定し、その後値を変更することはできない。
    • コンパイル時に値が確定し、実行時にその値が直接使用される。
  • readonly
    • 読み取り専用のフィールドを宣言するためのキーワード。
    • 初期化時に値を設定し、その後に値を変更することはできない。
    • 実行時に初期化されるため、コンストラクタ内で値を設定することが可能。

readonly

readonlyキーワードで宣言されたNameフィールドは、初期化時に値を設定しますが、その後でもコンストラクタ内でのみ値を再設定することができます。

using System;

public class MyClass
{
    // 宣言時に初期化
    public readonly int InitialValue = 10;

    // コンストラクタで初期化
    public MyClass(int value)
    {
        InitialValue = value; // 有効
    }

    // 他のメソッドでの変更は無効
    public void ChangeValue(int newValue)
    {
        // コンパイルエラー: readonly フィールドの変更はコンストラクタ内でのみ許可されている
        // InitialValue = newValue; // エラー
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass(20);
        Console.WriteLine(myClass.InitialValue); // 出力: 20

        // 初期化後に値を変更しようとするとエラーになる
        // myClass.ChangeValue(30); // コンパイルエラー
    }
}

まとめ

  • 再代入不可
    • constで宣言された変数は初期化後に再代入できません。これにより、プログラム内で定数としての値が保証されます。
  • 利用場面
    • クラスレベル: クラス全体で共有され、インスタンスメソッドや静的メソッドからアクセス可能。
    • メソッド内: メソッドのローカルスコープ内で変更不可能な値として使用。
    • 構造体: 構造体の全インスタンスで共有され、静的にアクセスできます。
  • constの利用できない場面
    • メソッドの戻り値: メソッドの戻り値として const を使うとコンパイルエラーになります。
    • プロパティ: プロパティには const を使用できません。
  • constとreadonlyの違い
    • const: コンパイル時に値が確定し、その後変更できません。
    • readonly: 実行時に初期化され、コンストラクタ内で値を設定できますが、以降の変更はできません。

Follow me!

-C#
-,

PAGE TOP