我正在使用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”。
任何想法?
答案 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;
}
使用上面的代码,两个对象之间没有引用。