C# Clone():创建并返回当前集合的副本

  • Post category:C#

Clone() 是一个用于克隆对象的 C# Object 类的成员方法。它用于创建一个与调用对象相同的副本,包括所有字段的值(包括值类型和引用类型)。在使用 Clone() 克隆时,克隆后的对象与原对象是两个不同的实例。对克隆后的对象所做的修改对原实例对象没有任何影响。

使用方式

  1. object.Clone() 方法可以在任何实现了 ICloneable 接口的对象上使用:
public interface ICloneable {
    object Clone();
}
  1. 在自定义的类中实现 ICloneable 接口并重写 Clone() 方法:
public class MyClass : ICloneable {
    public int Value1 { get; set; }
    public string Value2 { get; set; }

    public object Clone()
    {
        return new MyClass { Value1 = this.Value1, Value2 = this.Value2 };
    }
}

上面的示例中,MyClass 类实现了 ICloneable 接口,并重写了 Clone() 方法。在 Clone() 方法中,我们创建了一个新的 MyClass 实例并将原对象中的属性值复制到新对象中。这样就可以克隆出一个与原对象相同的新对象了。

案例示例

  1. 克隆字符串类型
string str1 = "hello";
string str2 = (string)str1.Clone();

Console.WriteLine("str1:{0}, str2:{1}", str1, str2);
Console.WriteLine("str1==str2: {0}", str1 == str2);
Console.WriteLine("str1.Equals(str2): {0}", str1.Equals(str2));

克隆字符串类型很简单,直接调用 Clone() 方法即可。输出结果为:

str1:hello, str2:hello
str1==str2: True
str1.Equals(str2): True
  1. 克隆自定义类型

接下来,我们演示一下如何克隆自定义的类型。

public class MyClass : ICloneable {
    public int Value1 { get; set; }
    public string Value2 { get; set; }

    public object Clone()
    {
        return new MyClass { Value1 = this.Value1, Value2 = this.Value2 };
    }
}

MyClass obj1 = new MyClass { Value1 = 1, Value2 = "hello" };
MyClass obj2 = (MyClass)obj1.Clone();

Console.WriteLine("obj1.Value1:{0}, obj1.Value2:{1}", obj1.Value1, obj1.Value2);
Console.WriteLine("obj2.Value1:{0}, obj2.Value2:{1}", obj2.Value1, obj2.Value2);
Console.WriteLine("obj1==obj2: {0}", obj1 == obj2);

我们先创建了一个 MyClass 对象 obj1,然后使用 Clone() 方法将其克隆到 obj2。

输出结果为:

obj1.Value1:1, obj1.Value2:hello
obj2.Value1:1, obj2.Value2:hello
obj1==obj2: False

根据输出结果可以看出,obj1 和 obj2 是不同的对象,但属性值是相等的。

注意事项

使用 Clone() 时需要注意以下几点:

  1. 如果要使用 Clone() 方法,必须确保对象的字段都是值类型或者可序列化的引用类型。
  2. 克隆的对象必须是新的实例,不应该使用枚举类型或静态变量。
  3. 如果一个对象有引用类型的字段,需要特别注意克隆的实现方式,否则可能出现误操作。