readonly (C# リファレンス)
更新 : 2007 年 11 月
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# 言語仕様」の次のセクションを参照してください。
- 10.4.2 readonly フィールド