如何声明只读不可变引用
本文关键字:只读 不可变 引用 声明 何声明 | 更新日期: 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; }
}