【问题标题】:How can I create a copy of an object using its constructor in c#?如何使用 c# 中的构造函数创建对象的副本?
【发布时间】:2017-07-21 14:57:14
【问题描述】:

我正在尝试使用其构造函数创建对象的副本,但是当我修改副本的某些内容时,原始对象也被修改了。如果您能帮助我,我将不胜感激,这是我的代码:

public class XMLStructure
{
 public XMLStructure(XMLStructure xmlCopy )
  {
     this.Action = xmlCopy.Action;
     this.Name = xmlCopy.Name;
  }
  public String Name { get; set; }
  public ActionXML Action { get; set; }
}

【问题讨论】:

  • 确实是复制了字符串,但ActionXML 仍会引用原始字符串
  • That 不是重复的Servy
  • @servy:这个问题的主题是:为什么这个复制构造函数不能按预期工作?答:因为是半成品。相关问题的问题是:如果我将副本传递给更改它的方法,为什么我的原始实例会更改?答:因为它根本不是副本,而是相同的参考。
  • 这里有很多关于需要克隆 Action 属性的建议,但没有人建议对 name 属性使用 String.Copy() 以确保新克隆对象的 Name 属性是真正独立的字符串的副本。由于不可变的 .Net 字符串,我很欣赏这是一个边缘情况,但我觉得提到 String.Copy() 会增加讨论。

标签: c# .net


【解决方案1】:

ActionXML 是引用类型,您还需要创建一个 ActionXML 的副本。

Here 是一个指向解释引用类型与值类型的网页的链接。

【讨论】:

    【解决方案2】:

    您需要“深度克隆”对象以避免您观察到的问题。在 .Net 中执行此操作的公认方法多年来一直在发展。今天最简单的选择是将一个对象序列化为一个 JSON 字符串,然后从该 JSON 字符串中合成一个新对象。

    var json = JsonConvert.SerializeObject(xmlSourceObject );
    var clonedXmlObject = JsonConvert.DeserializeObject<XMLStructure>(json);
    

    更传统的 .Net 解决方案是实现 ICloneable 接口。

    【讨论】:

      【解决方案3】:

      您需要为 ActionXML 和该类中的任何其他引用类型变量执行相同的操作(添加允许复制的构造函数)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-05
        • 1970-01-01
        • 2017-08-10
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        • 1970-01-01
        • 2021-01-23
        相关资源
        最近更新 更多