创建不可变的 JObject
Creating Immutable JObject
我正在尝试创建 JObject 的扩展 class,它是不可变的。
如果我像下面这样创建一个 class,它能阻止实际的 JObject 被修改吗?
public class ImmutableJObejct: JObject
{
public readonly JObject JObject;
public ImmutableJObejct(JObject jObject)
{
this.JObject = jObject;
}
}
哪种方法是正确的?
我不应该扩展代码并实现 JOBject 所需的每个方法吗?
基本上每次都可以 return 一个新的 JObject 实例。
public class ImmutableJObejct
{
private readonly JObject _jObject;
public ImmutableJObejct(JObject jObject)
{
_jObject = jObject;
}
public JObject JObject
{
get { return new JObject(_jObject); }
}
}
回答你的问题:是和不是。或者 "it depends".
基本上有 2 种不可变对象:"shallow" 所有属性都是只读的并且没有任何修改状态的方法的不可变对象,以及 "deep" 不仅所有属性都是只读的不可变对象只读,它们本身也是不可变的或可变对象的副本。
您的示例是浅层不可变对象的示例。它不允许您在创建后给 ImmutableJobject 一个新的 JOject,但您可以更改该对象的属性。要使其成为深层不可变对象,需要将字段 JObject 更改为只读 属性,每次访问时都会创建一个新的 JObject。
更新: 与所有事物一样,不变性伴随着成本和收益。主要成本是需要创建更多对象,以捕获新状态或防止深度不可变对象的属性发生更改。根据创建的此类对象的数量以及它们的长度 tracked/referenced,这可能会影响 cpu 和内存。除非您控制对象 graph/hierarchy 中的所有对象,否则您几乎无法避免此成本。
我正在尝试创建 JObject 的扩展 class,它是不可变的。
如果我像下面这样创建一个 class,它能阻止实际的 JObject 被修改吗?
public class ImmutableJObejct: JObject
{
public readonly JObject JObject;
public ImmutableJObejct(JObject jObject)
{
this.JObject = jObject;
}
}
哪种方法是正确的? 我不应该扩展代码并实现 JOBject 所需的每个方法吗?
基本上每次都可以 return 一个新的 JObject 实例。
public class ImmutableJObejct
{
private readonly JObject _jObject;
public ImmutableJObejct(JObject jObject)
{
_jObject = jObject;
}
public JObject JObject
{
get { return new JObject(_jObject); }
}
}
回答你的问题:是和不是。或者 "it depends".
基本上有 2 种不可变对象:"shallow" 所有属性都是只读的并且没有任何修改状态的方法的不可变对象,以及 "deep" 不仅所有属性都是只读的不可变对象只读,它们本身也是不可变的或可变对象的副本。
您的示例是浅层不可变对象的示例。它不允许您在创建后给 ImmutableJobject 一个新的 JOject,但您可以更改该对象的属性。要使其成为深层不可变对象,需要将字段 JObject 更改为只读 属性,每次访问时都会创建一个新的 JObject。
更新: 与所有事物一样,不变性伴随着成本和收益。主要成本是需要创建更多对象,以捕获新状态或防止深度不可变对象的属性发生更改。根据创建的此类对象的数量以及它们的长度 tracked/referenced,这可能会影响 cpu 和内存。除非您控制对象 graph/hierarchy 中的所有对象,否则您几乎无法避免此成本。