C#类的深拷贝和浅拷贝举例
时间: 2024-08-26 15:01:09 浏览: 90
在C#中,当我们谈论类的拷贝,通常分为浅拷贝和深拷贝两种。浅拷贝只是复制了引用,而深拷贝则复制了对象本身的所有内容。
**浅拷贝示例**(对于值类型或引用类型,如果实现浅拷贝容易):
```csharp
class Point
{
public int X { get; set; }
public int Y { get; set; }
}
Point original = new Point() { X = 1, Y = 2 };
Point shallowCopy = original; // 浅拷贝,这里的original和shallowCopy指向的是同一个内存地址
// 修改浅拷贝的X坐标
shallowCopy.X = 3;
Console.WriteLine(original.X); // 输出 3,因为两者指向同一位置
```
**深拷贝示例**(使用`Clone()`方法或序列化反序列化,尤其是对复杂对象):
```csharp
class ComplexObject : ICloneable
{
public int Id { get; set; }
public List<Point> Points { get; set; }
object ICloneable.Clone()
{
return MemberwiseClone(); // 使用MemberwiseClone()做深拷贝
}
}
ComplexObject complexOriginal = new ComplexObject()
{
Id = 1,
Points = new List<Point> { new Point() { X = 1, Y = 2 } }
};
// 创建深拷贝
ComplexObject deepCopy = (ComplexObject)complexOriginal.Clone();
// 修改深拷贝的Points列表
deepCopy.Points.X = 3;
Console.WriteLine(complexOriginal.Points.X); // 输出 2,因为原对象和深拷贝是独立的
```
在上述`ComplexObject`的例子中,由于`Points`字段包含`Point`对象,所以我们使用`ICloneable`接口和`MemberwiseClone()`方法实现了深拷贝,这样即使`Points`中有子对象,也能保证所有内容被独立地复制。
阅读全文