在 C# 中实现只读属性

Bilal Shahid 2023年1月30日 2022年7月18日
  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# 中实现只读的方式。

Author: 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