readonly (C# リファレンス)
readonly キーワードは、フィールドに使用できる修飾子です。フィールド宣言が readonly 修飾子を含む場合、宣言によって導入されるフィールドへの代入は、宣言の一部としてだけ、または同じクラスのコンストラクター内でだけ発生できます。
使用例
この例では、クラス コンストラクターに値を割り当てる場合でも、ChangeYear メソッドでは year フィールドの値を変更できません。
class Age
{
readonly int _year;
Age(int year)
{
_year = year;
}
void ChangeYear()
{
//_year = 1967; // Compile error if uncommented.
}
}
readonly のフィールドに値の代入ができるのは、次のコンテキスト内に限られます。
値が宣言で初期化される場合。たとえば、次のようになります。
public readonly int y = 5;
インスタンス フィールドの場合は、フィールド宣言を含んでいるクラスのインスタンス コンストラクター内。静的フィールドの場合は、フィールド宣言を含んでいるクラスの静的コンストラクター内。また、これらのコンテキスト内でだけ、readonly フィールドを out パラメーターまたは ref パラメーターとして渡すことができます。
[!メモ]
readonly キーワードは const キーワードとは異なります。const フィールドは、フィールドの宣言でしか初期化できません。readonly フィールドは、宣言またはコンストラクターのどちらかで初期化できます。このため、readonly フィールドは、使用するコンストラクターに応じて異なる値を持つことができます。また、const フィールドがコンパイル時定数であるのに対し、readonly フィールドは実行時定数として使用できます。次に例を示します。
public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;
public class ReadOnlyTest
{
class SampleClass
{
public int x;
// Initialize a readonly field
public readonly int y = 25;
public readonly int z;
public SampleClass()
{
// Initialize a readonly instance field
z = 24;
}
public SampleClass(int p1, int p2, int p3)
{
x = p1;
y = p2;
z = p3;
}
}
static void Main()
{
SampleClass p1 = new SampleClass(11, 21, 32); // OK
Console.WriteLine("p1: x={0}, y={1}, z={2}", p1.x, p1.y, p1.z);
SampleClass p2 = new SampleClass();
p2.x = 55; // OK
Console.WriteLine("p2: x={0}, y={1}, z={2}", p2.x, p2.y, p2.z);
}
}
/*
Output:
p1: x=11, y=21, z=32
p2: x=55, y=25, z=24
*/
上の例で、次のようにステートメントを使用するとします。
p2.y = 66; // Error
次のコンパイル エラー メッセージが表示されることになります。
The left-hand side of an assignment must be an l-value
これは、定数に値を代入しようとしたときのエラーと同じです。
C# 言語仕様
詳細については、「C# 言語仕様」を参照してください。言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。