我有一些信息,在执行程序中没有改变。它是一种静态信息。我使用以下代码:
public class Foo
{
public static readonly List<int> = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
};
不幸的是,在执行程序时,我可以更改此类static
成员的字段。结果我有以下警告:
&#34;不要声明只读可变引用类型&#34;。
应对此问题的最佳做法是什么?
答案 0 :(得分:3)
在C#中,不可能使其他人的成员成为不可变的。我猜你熟悉const引用的C ++概念,但是C#没有这样的东西。
如果你想控制访问,我会将字体设为私有,并为Foo添加只读静态属性和方法。这意味着您可以获得只读访问权限;
Foo.TypeFaceSize;
Foo.TypeFaceName;
答案 1 :(得分:1)
C#编译器只能强制只读访问属性或字段。如果只读取一个字段,则该字段中对象的可设置属性仍然是可设置的,更改它的唯一方法是修改对象的类定义。
您可以将对象包装在自己的自定义类中,并且只允许使用getter。但是你可能需要有几层包装器,所以我建议不要这样做,只关注编译器警告。
答案 2 :(得分:1)
您无法将C#中的可变类型变为不可变类型。
如果您希望公开TypeFace
类似不可变类型,您可以使用具有相同属性的类型包装它,但它将它们公开为read-只有属性:
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; }
}