在 C# 中實現只讀屬性

Bilal Shahid 2024年2月15日
  1. C# 中初始化時宣告變數的只讀屬性
  2. 使用 C# 中的簡單 get 屬性實現只讀屬性
在 C# 中實現只讀屬性

今天我們將學習如何在 C# 中建立一個只讀屬性,使其只能讀取而不能修改。

C# 中初始化時宣告變數的只讀屬性

我們在最後兩篇文章中研究了 CAR 類。讓我們使用同一個類並嘗試實現一個只讀屬性。假設我們的類 CAR 有一個稱為 maker_id 的屬性,出於安全目的,我們希望將其保持為只讀。

class CAR {
  private readonly int maker_id;

  public CAR(int maker_id) {
    this.maker_id = maker_id;
  }

  public int get_maker_id() {
    return maker_id;
  }
}
static void Main(String[] args) {
  CAR x = new CAR(5);
  Console.WriteLine(x.get_maker_id());
}

所以我們將 maker_id 宣告為 readonly。如果你執行上面的,輸出將是:

5

因此,假設我們現在希望為我們的 maker_id 欄位新增另一個 setter。然後我們可以做如下事情:

public void set_maker_id(int maker_id) {
  this.maker_id = maker_id;
}

但是,你現在會注意到它會引發錯誤:

變數上的 C# 只讀屬性 - 錯誤

所以你可以看到 readonly 屬性只允許我們將值分配給建構函式中的變數一次。否則,由於可訪問性,它往往會丟擲錯誤並拒絕修改。

完整程式碼如下所示:

class CAR {
  private readonly int maker_id;

  public CAR(int maker_id) {
    this.maker_id = maker_id;
  }

  public void set_maker_id(int maker_id) {
    this.maker_id = maker_id;  // line ERROR
  }

  public int get_maker_id() {
    return maker_id;
  }
}
static void Main(String[] args) {
  CAR x = new CAR(5);
  Console.WriteLine(x.get_maker_id());
}

該錯誤已在程式碼中的註釋中提及。

使用 C# 中的簡單 get 屬性實現只讀屬性

我們可以將 maker_id 屬性編寫如下:

private int maker_id { get; }

如果你嘗試編寫如下函式:

public void set_val(int val) {
  this.maker_id = val;
}

會產生如下錯誤:

使用 GET 的 C# 只讀屬性 - 錯誤

所以你會看到設定 get 屬性是如何使它成為只讀的。完整程式碼如下:

class CAR {
  private int maker_id { get; }

  public CAR(int maker_id) {
    this.maker_id = maker_id;
  }

  public void set_val(int val) {
    this.maker_id = val;
  }
}
static void Main(String[] args) {
  CAR x = new CAR(5);
}

這不僅遵循約定規則,而且還傾向於破壞序列化程式。此外,它不會改變並且往往是不可變的。

如果你想確保 get 返回某些內容,請按如下方式編寫程式碼:

class CAR {
  public int maker_id {
    get { return maker_id; }
  }
}

這就是你在 C# 中實現只讀的方式。

作者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

相關文章 - Csharp Property