详解 C# 克隆
在 C# 中,克隆指的是创建一个新对象,这个新对象和旧对象具有相同的属性和值。为了实现克隆,我们需要使用ICloneable接口。在本文中,我们将详细讲解如何使用 C# 克隆。
ICloneable 接口
ICloenable 是 C# 中用来定义克隆能力的接口,它只包含一个方法 Clone()。当实现这个接口时,需要实现 Clone 方法并返回一个新的对象。使用这种方式,我们就可以通过调用克隆方法来复制对象。
下面是实现 ICloneable 接口的示例代码:
public class Person : ICloneable
{
public string Name { get; set; }
public int Age { get; set; }
public object Clone()
{
return new Person { Name = this.Name, Age = this.Age };
}
}
浅复制
浅复制是指只复制对象的值类型成员和引用类型成员的引用。也就是说,复制的是引用而不是对象本身。在使用浅复制时,两个对象中的一个对象的更改将会影响到另一个对象。
下面是浅复制的示例代码:
public class Person : ICloneable
{
public string Name { get; set; }
public int Age { get; set; }
public Address Address { get; set; }
public object Clone()
{
return this.MemberwiseClone();
}
}
public class Address
{
public string Street { get; set; }
}
var person1 = new Person
{
Name = "Tom",
Age = 18,
Address = new Address { Street = "123 Main St" }
};
var person2 = (Person)person1.Clone();
person2.Address.Street = "456 Second St";
Console.WriteLine(person1.Address.Street); // 输出 456 Second St
Console.WriteLine(person2.Address.Street); // 输出 456 Second St
我们可以看到,当我们使用浅复制时,更改对象的 Address 属性时,两个实例的属性都被更改了。
深复制
深复制是指创建一个新对象,并复制对象中所有的值类型和引用类型。这种方式不会复制引用,而是创建新实例的引用,因此更改复制的对象不会影响其他对象。
下面是深复制的示例代码:
public class Person : ICloneable
{
public string Name { get; set; }
public int Age { get; set; }
public Address Address { get; set; }
public object Clone()
{
return new Person
{
Name = this.Name,
Age = this.Age,
Address = new Address { Street = this.Address.Street }
};
}
}
public class Address
{
public string Street { get; set; }
}
var person1 = new Person
{
Name = "Tom",
Age = 18,
Address = new Address { Street = "123 Main St" }
};
var person2 = (Person)person1.Clone();
person2.Address.Street = "456 Second St";
Console.WriteLine(person1.Address.Street); // 输出 123 Main St
Console.WriteLine(person2.Address.Street); // 输出 456 Second St
我们可以看到,当我们使用深复制时,更改对象的 Address 属性时,只有复制的实例的属性被更改了,而原始实例的地址属性保持不变。
这就是使用 C# 克隆的完整攻略。以上是两个示例,分别是浅复制和深复制的例子。你可以根据需要在你的项目中选择适合你的克隆方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解 c# 克隆 - Python技术站