创建不可变的JObject

时间:2017-11-15 01:37:51

标签: c# immutability

我正在尝试创建一个JObject的扩展类,它是不可变的。

如果我创建一个如下所示的类,是否可以阻止实际的JObject被修改?

public class ImmutableJObejct: JObject
{
    public readonly JObject JObject;
    public ImmutableJObejct(JObject jObject)
    {
        this.JObject = jObject;
    }
}

哪种方法正确? 我不应该花费代码并从JOBject实现我需要的每个方法吗?

2 个答案:

答案 0 :(得分:2)

基本上你每次都可以返回一个新的JObject实例。

public class ImmutableJObejct
{
    private readonly JObject _jObject;

    public ImmutableJObejct(JObject jObject)
    {
        _jObject = jObject;
    }

    public JObject JObject
    {
        get { return new JObject(_jObject); }
    }
}

答案 1 :(得分:2)

回答你的问题:是和否。或者"它取决于"。

基本上有两种不可变对象:"浅"不可变对象,其中所有属性都是只读的,并且没有任何修改状态的方法,并且"深"不可变对象,其中不仅所有属性都是只读的,它们本身也是不可变的或可变对象的副本。

您的示例是浅不可变对象的示例。它不允许您在创建一个新的JOject时为其提供一个新的JOject,但您可以更改该对象的属性。为了使它成为一个深层不可变对象,需要将字段JObject更改为readonly属性,每次访问它时都会创建一个新的JObject。

更新:与所有事情一样,不可抗拒性带来成本和收益。主要成本是需要创建更多对象,要么捕获新状态,要么保持深层不可变对象不再更改其属性。根据创建的对象数量以及跟踪/引用它们的时间长短,这会影响cpu和内存。除非您控制对象图形/层次结构中的所有对象,否则您无法避免此成本。