我正在尝试创建一个JObject的扩展类,它是不可变的。
如果我创建一个如下所示的类,是否可以阻止实际的JObject被修改?
public class ImmutableJObejct: JObject
{
public readonly JObject JObject;
public ImmutableJObejct(JObject jObject)
{
this.JObject = jObject;
}
}
哪种方法正确? 我不应该花费代码并从JOBject实现我需要的每个方法吗?
答案 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和内存。除非您控制对象图形/层次结构中的所有对象,否则您无法避免此成本。