在 C# 中实现只读属性

Bilal Shahid 2024年2月15日
  1. C# 中初始化时声明变量的只读属性
  2. 使用 C# 中的简单 get 属性实现只读属性
在 C# 中实现只读属性

今天我们将学习如何在 C# 中创建一个只读属性,使其只能读取而不能修改。

C# 中初始化时声明变量的只读属性

我们在最后两篇文章中研究了 CAR 类。让我们使用同一个类并尝试实现一个只读属性。假设我们的类 CAR 有一个称为 maker_id 的属性,出于安全目的,我们希望将其保持为只读。

using System;

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;
  }
}

public class Program {
  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 属性只允许我们将值分配给构造函数中的变量一次。否则,由于可访问性,它往往会抛出错误并拒绝修改。

完整代码如下所示:

using System;

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;
  }
}

public class Program {
  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 属性是如何使它成为只读的。完整代码如下:

using System;

class CAR {
  private int maker_id {
    get;
    set;
  }

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

class Program {
  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