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(定数)に関する主な疑問や問題点について、いくつかのポイントを挙げてみます。
- constの利用場面: constで宣言された変数は再代入できないことが基本ですが、その意味と実際の利用場面について。
- constの利用できない場面:constが使えない場面とは。
- constとreadonlyの違い: constとreadonlyの違いについての理解。
この記事ではこれらについても詳しく解説します。
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); // コンパイルエラー
}
}