readonly (C# 參考)

更新:2007 年 11 月

readonly 關鍵字是可以用於欄位的修飾詞。欄位宣告如果包含 readonly 修飾詞,由宣告引入的欄位設定只能發生在宣告的一部分或者是相同類別裡的建構函式。

範例

在這個範例中,year 欄位的值無法在方法 ChangeYear 中改變,即使在此類別建構函式中已指定值給它:

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 欄位當做 outref 參數傳遞的有效內容。

注意事項:

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 唯讀欄位

請參閱

概念

C# 程式設計手冊

參考

C# 關鍵字

修飾詞 (C# 參考)

const (C# 參考)

欄位 (C# 程式設計手冊)

其他資源

C# 參考