📜  C#中的Object.MemberwiseClone方法与示例(1)

📅  最后修改于: 2023-12-03 14:40:32.012000             🧑  作者: Mango

C#中的Object.MemberwiseClone方法

在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方法可以方便地创建一个对象的浅表副本,它可以用来备份数据、撤销操作、多线程处理等场合。但需要注意的是,它并不适用于复杂类型的对象,因为这些对象的引用类型变量会共享相同的引用地址。对于复杂类型的对象,可以使用序列化和反序列化等方式来实现深拷贝。