.net memberwiseclone浅拷贝不起作用

时间:2010-10-10 16:19:19

标签: c# clone shallow-copy

我正在使用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”。

任何想法?

2 个答案:

答案 0 :(得分:2)

当浅层复制Customer对象时,objCustomerShallowCopy.Name将是James,并且在您更改该对象之前将保持这样。现在在你的情况下,字符串“James”将提供3个引用(objCustomer,objCustomer2和objCustomerShallowCopy)。

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

答案 1 :(得分:0)

我们也遇到了问题。我们通过序列化然后反序列化对象来解决它。

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;
}

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