类的特定实例可以不可变吗?[复制]

Can a specific instance of a class be immutable? [duplicate]

提问人:Kyle Delaney 提问时间:10/28/2017 最后编辑:Kyle Delaney 更新时间:10/28/2017 访问量:89

问:

我想看看我是否可以使类的实例不可变,即使类本身不是。我在这里遇到的情况与其他类似的静态字段类似,只是它是一个可变的类而不是结构。IntPtr.Zero

class TestClass
{
    public static readonly TestClass GoldStandard = new TestClass();
    public int field = 0;
}

class Program
{
    static void Main(string[] args)
    {
        TestClass test = TestClass.GoldStandard;

        test.field = 1; // I want to keep this from happening.

        Console.WriteLine(TestClass.GoldStandard.field);
    }
}

我能做些什么来防止被修改?GoldStandard

编辑:我很遗憾我的问题被严重误解了。这显然不是 C# 中 Immutable 类型和属性的重复项,也不是 如何创建不可变类?。这些问题是关于如何创建一个不可变类,而不是如何创建一个可变类的不可变实例。

至于有没有一种简单的方法可以制作一个类的不可变版本?,这听起来肯定与我的问题非常相似。但是,有一些重要原因不应该计算在内。

  1. 该问题询问如何使实例在实例生命周期中的某个时间点不可变,而不是从一开始就让可变类的一个实例不可变。
  2. 该问题询问如何生成一个不可变的第二个类来模仿一个可变类,而不是让一个可变类在特定情况下充当不可变类。
  3. 这个问题的答案甚至根本没有解决我的问题,主要是关于不可变类的一般工作方式。

我理解版主在扫描重复项时不能花太多时间深入理解问题,但我几乎不认为由于这种表面上的相似性而将我的问题作为重复项关闭是公平的。

c# 不变性 只读 可变

评论

2赞 Alejandro 10/28/2017
这个问题显然不是重复的。这些“重复项”使整个类不可变,而不是特定实例。
1赞 Igor 10/28/2017
@Alejandro - 请参阅第 3 个链接,该问题的第一句话询问的正是该问题所问的内容。我看不出这个问题怎么不是那个问题的重复。Is there an easy way to make an instance immutable?
0赞 Kyle Delaney 10/28/2017
即使第 3 个链接确实算数,也应删除前两个链接。
1赞 15ee8f99-57ff-4f92-890c-b56153 10/28/2017
在 C# 中无法做到这一点。这就是 ReadOnlyCollection<T> 等类存在的原因。你的回答是:“你必须显式地将你的类型设计为不可变的。

答: 暂无答案