【问题标题】:.net memberwiseclone shallow copy not working.net memberwiseclone 浅拷贝不起作用
【发布时间】:2011-04-23 11:59:01
【问题描述】:

我正在使用 this.MemberwiseClone() 创建浅拷贝,但它不起作用。请看下面的代码。

public class Customer
    {

        public int Id;
        public string Name;

        public Customer CreateShallowCopy()
        {
            return (Customer)this.MemberwiseClone();
        }
    }

class Program
{
    static void Main(string[] args)
    {
        Customer objCustomer = new Customer() { Id = 1, Name = "James"};
        Customer objCustomer2 = objCustomer;

        Customer objCustomerShallowCopy = objCustomer.CreateShallowCopy();

        objCustomer.Name = "Jim";
        objCustomer.Id = 2;            
    }
}

当我运行程序时,它显示 objCustomerShallowCopy.Name 为“James”而不是“Jim”。

有什么想法吗??

【问题讨论】:

    标签: c# clone shallow-copy


    【解决方案1】:

    当您对 Customer 对象进行浅拷贝时,objCustomerShallowCopy.Name 将是 James,并且在您更改该对象之前将保持不变。现在,在您的情况下,字符串“James”将为它提供 3 个引用(objCustomer、objCustomer2 和 objCustomerShallowCopy)。

    当您将 objCustomer.Name 更改为 Jim 时,您实际上是在为 objCustomer 对象创建一个新的字符串对象并将 1 引用释放给“James”字符串对象。

    【讨论】:

    • 如何更改“objCustomer”属性(引用类型),以便可以看到“objCustomerShallowCopy”中反映的更改??
    • 在这种情况下,为什么首先使用克隆?只需设置 objCustomerShallowCopy = objCustomer
    • 为什么文档说 MemberwiseClone 做了浅拷贝,而实际上它没有做。它正在做一个深拷贝。
    • MemberwiseClone 正在制作浅拷贝,如文档所述。你必须记住字符串是不可变的。正如答案所说,当您分配objCustomer.Name = "Jim" 时,您正在创建一个新的字符串对象并将其分配给objCustomer.Name。 “问题”是您不理解“浅拷贝”的含义。
    • 没关系...我想通了..它确实在做一个浅拷贝..通过在客户类中添加另一个成员地址来测试它。具有 int 成员的地址。当我通过objCustomer.Address.Pincode = 456更改时,它反映在objCustomerShallowcopy中。
    【解决方案2】:

    我们在让它发挥作用时也遇到了问题。我们已经通过序列化然后反序列化对象来解决它。

    public static T DeepCopy<T>(T item)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        MemoryStream stream = new MemoryStream();
        formatter.Serialize(stream, item);
        stream.Seek(0, SeekOrigin.Begin);
        T result = (T)formatter.Deserialize(stream);
        stream.Close();
        return result;
    }
    

    使用上面的代码,两个对象之间将没有引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 2015-01-13
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多