如何声明只读不可变引用

本文关键字:只读 不可变 引用 声明 何声明 | 更新日期: 2023-09-27 18:04:53

我有一些信息,这些信息在程序执行过程中没有改变。这是一种静态信息。我使用以下代码:

public class Foo
{
    public static readonly List<int> = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
};

不幸的是,在程序执行期间,我可以更改这样的static成员的字段。因此,我有以下警告:

"不要声明只读可变引用类型"。

处理这个问题的最佳做法是什么?

如何声明只读不可变引用

在c#中,不可能使其他人的类的成员不可变。我猜你对c++的const引用概念很熟悉,但是c#没有这样的概念。

如果你想控制访问,我将字体设为私有,并为Foo添加只读静态属性和方法。这意味着您可以获得只读访问权限,如;

Foo.TypeFaceSize;
Foo.TypeFaceName;

c#编译器只能强制对属性或字段进行只读访问。如果您将一个字段设置为只读,则该字段中对象的可设置属性仍然是可设置的,更改它的唯一方法是修改该对象的类定义。

您可以将对象包装在您自己的自定义类中,并且只允许getter。但是您可能需要有几层包装器,所以我建议不要这样做,只需注意编译器警告。

在c#中不能像那样将可变类型变为不可变类型

如果你想让TypeFace 一样是一个不可变的类型,你可以包装成一个具有相同属性的类型,但它将它们暴露为只读属性:

public class A
{
    public string Text { get; set; }
}
public class AReadOnly
{
     public AReadOnly(A a)
     {
         A = a;
     }
     private A A { get; }
     public string Text => A.Text;
}
public class B
{
    public B()
    {
        A = new AReadOnly(_A);
    }
    private A _A { get; } = new A();
    public AReadOnly A { get; }
}