📅  最后修改于: 2023-12-03 14:40:32.012000             🧑  作者: Mango
在C#中,有一个Object类的MemberwiseClone方法,可以用来创建一个对象的浅表副本,也就是只复制值类型变量和引用类型变量的引用地址,而不会复制引用类型变量所指向的对象。下面我们来详细介绍一下这个方法的使用。
使用MemberwiseClone方法可以实现对象的浅表复制,即只复制对象本身,而不会复制对象引用的对象。操作如下:
class MyClass : ICloneable
{
public int MyInt;
public string MyString;
public object MyObject;
public object Clone()
{
return this.MemberwiseClone();
}
}
上面的示例中,MyClass是一个自定义类,将其定义为ICloneable接口并实现Clone方法,然后在Clone方法中调用MemberwiseClone方法,就可以创建一个MyClass对象的浅表副本。
下面我们来看一个例子,在这个例子中,我们定义了一个Person类,并通过MemberwiseClone方法创建一个对象的浅表副本。当我们修改浅表副本时,原始对象不会受到影响,因为它们共享相同的引用地址。
class Person
{
public string Name;
public Address Address;
public Person(string name, Address address)
{
Name = name;
Address = address;
}
}
class Address
{
public string City;
public Address(string city)
{
City = city;
}
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Person("Tom", new Address("Beijing"));
Person p2 = (Person)p1.Clone();
p2.Name = "Jerry";
p2.Address.City = "Shanghai";
Console.WriteLine($"p1: {p1.Name} {p1.Address.City}");
Console.WriteLine($"p2: {p2.Name} {p2.Address.City}");
}
}
上面的代码中,我们创建了一个Person对象p1,它的Name属性为"Tom",Address属性为一个地址对象,该地址对象的City属性为"Beijing"。然后我们使用MemberwiseClone方法创建了一个p1的浅表副本p2,将其Name属性修改为"Jerry",Address属性的City属性修改为"Shanghai"。
最终运行结果如下:
p1: Tom Shanghai
p2: Jerry Shanghai
可以看到,p1的Name属性并未受到影响,但p1和p2的Address属性指向同一个地址对象,因此p2的修改也会同时影响p1的Address属性。
MemberwiseClone方法可以方便地创建一个对象的浅表副本,它可以用来备份数据、撤销操作、多线程处理等场合。但需要注意的是,它并不适用于复杂类型的对象,因为这些对象的引用类型变量会共享相同的引用地址。对于复杂类型的对象,可以使用序列化和反序列化等方式来实现深拷贝。