C#におけるconstとreadonlyの代替方法
C#におけるconstとreadonlyの違い
constとreadonlyは、C#で定数を定義するために使用されるキーワードですが、その挙動は異なる点がいくつかあります。
constキーワード
- コンパイル時定数: constキーワードで宣言された変数は、コンパイル時にその値が決定され、変更することができません。
- 直接割り当て: const変数は、宣言時に直接値を割り当てる必要があります。
- スタックまたはリテラル: const変数は、スタックまたはリテラルに格納されます。
- 使用場所: const変数は、あらゆる場所で使用できます。
const int MAX_VALUE = 100;
readonlyキーワード
- 実行時定数: readonlyキーワードで宣言された変数は、実行時に値が決定され、一度初期化されると変更できません。
- コンストラクタまたはフィールドイニシャライザー: readonly変数は、コンストラクタまたはフィールドイニシャライザーで初期化されます。
- ヒープ: readonly変数は、ヒープに格納されます。
- 使用場所: readonly変数は、クラスの内部で使用されます。
public class MyClass
{
public readonly int ReadonlyValue;
public MyClass(int value)
{
ReadonlyValue = value;
}
}
いつどちらを使用するか
- コンパイル時の値がわかっている場合: constを使用します。
- 実行時に値が決定される場合: readonlyを使用します。
- クラスの内部で使用する場合: readonlyを使用します。
- constはコンパイル時定数で、宣言時に値を直接割り当てる必要があります。
- readonlyは実行時定数で、コンストラクタまたはフィールドイニシャライザーで初期化されます。
- どちらを使用するかは、定数の値がいつ決定されるかによって決まります。
// コンパイル時定数
const int MAX_VALUE = 100;
// 使用例
int value = 50;
if (value > MAX_VALUE)
{
Console.WriteLine("値は最大値を超えています");
}
public class Person
{
public readonly string Name;
public readonly int Age;
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
// 使用例
Person person = new Person("John Doe", 30);
Console.WriteLine(person.Name); // 出力: John Doe
// person.Name = "Jane Doe"; // エラー: readonly変数は変更できません
constとreadonlyの違いを理解するための例
public class MyClass
{
public const int ConstValue = 10;
public readonly int ReadonlyValue;
public MyClass(int value)
{
ReadonlyValue = value;
}
}
// 使用例
MyClass instance1 = new MyClass(20);
MyClass instance2 = new MyClass(30);
Console.WriteLine(MyClass.ConstValue); // 出力: 10
Console.WriteLine(instance1.ReadonlyValue); // 出力: 20
Console.WriteLine(instance2.ReadonlyValue); // 出力: 30
// MyClass.ConstValue = 20; // エラー: const変数は変更できません
// instance1.ReadonlyValue = 30; // エラー: readonly変数は変更できません
静的プロパティ
- クラスレベルの定数: 静的プロパティを使用して、クラスレベルの定数を定義することができます。
- 計算された値: 静的プロパティは、計算された値を返すことができます。
public class MyClass
{
public static int MaxValue { get; } = 100;
public static int CalculateValue(int a, int b)
{
return a + b;
}
}
列挙型
- 定数の集合: 列挙型は、関連する定数の集合を定義するために使用されます。
- 名前付き定数: 列挙型のメンバーは、名前付き定数として使用されます。
public enum DaysOfWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
読み取り専用フィールド
- クラスの内部で使用: 読み取り専用フィールドは、クラスの内部で使用されます。
public class MyClass
{
private readonly int _value;
public MyClass(int value)
{
_value = value;
}
public int GetValue()
{
return _value;
}
}
- コンパイル時定数: constを使用します。
- 実行時定数: readonlyまたは静的プロパティを使用します。
- 関連する定数の集合: 列挙型を使用します。
- const、readonly、静的プロパティ、列挙型、読み取り専用フィールドは、C#で定数を定義するためのさまざまな方法です。
- どの方法を使用するかは、定数の性質と使用状況によって決まります。
c# .net constants