1

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

有任何想法吗??

4

2 回答 2

2

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

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

于 2010-10-10T16:28:46.523 回答
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;
}

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

于 2010-10-10T16:27:08.397 回答