如何声明只读不可变引用?

时间:2016-08-30 08:23:45

标签: c# .net

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

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

不幸的是,在执行程序时,我可以更改此类static成员的字段。结果我有以下警告:

  

&#34;不要声明只读可变引用类型&#34;。

应对此问题的最佳做法是什么?

3 个答案:

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