C#中当一个List充当一个类的成员变量,这个类进行Clone复制时。如何让这个类的字典变量赋值时使用的是不同的地址
时间: 2024-11-15 15:33:20 浏览: 4
C#中Clone一个对象的值到另一个对象案例 c#经典案例.pdf
在C#中,当一个类包含一个List作为成员变量时,如果直接使用浅拷贝(如通过MemberwiseClone方法)来复制这个类的实例,那么新对象中的List成员变量将引用原始对象中的同一个List实例。这意味着对新对象的List进行修改会影响到原始对象的List。
为了确保在进行Clone操作时,List成员变量使用的是不同的地址,我们需要实现深拷贝。深拷贝意味着不仅要复制对象本身,还要递归地复制所有引用类型的成员变量,以确保它们指向新的、独立的内存地址。
以下是如何实现深拷贝的一个示例:
```csharp
using System;
using System.Collections.Generic;
public class MyClass : ICloneable
{
public List<int> MyList { get; set; }
public MyClass()
{
MyList = new List<int>();
}
public object Clone()
{
// 创建当前对象的浅拷贝
MyClass cloned = (MyClass)this.MemberwiseClone();
// 为List成员变量创建一个新的List实例,并复制元素
cloned.MyList = new List<int>(this.MyList);
return cloned;
}
}
class Program
{
static void Main()
{
MyClass original = new MyClass();
original.MyList.Add(1);
original.MyList.Add(2);
MyClass cloned = (MyClass)original.Clone();
cloned.MyList.Add(3);
Console.WriteLine("Original List: " + string.Join(", ", original.MyList)); // 输出: 1, 2
Console.WriteLine("Cloned List: " + string.Join(", ", cloned.MyList)); // 输出: 1, 2, 3
}
}
```
在这个例子中,我们首先通过`MemberwiseClone`方法创建了一个浅拷贝,然后为List成员变量创建了一个新的List实例,并将原始List的元素复制到新List中。这样,克隆对象和原始对象的List成员变量就指向了不同的内存地址,修改其中一个不会影响另一个。
阅读全文