memberwiseclone还会复制派生类中定义的成员吗?

Jef*_*nes 4 c# clone copy

我需要定义一个执行浅拷贝的Clone()方法.(不需要深层复制)

但我需要复制派生类的成员.

如果我有

class Base {
     int baseMember;
     public (virtual?) Base Clone() {
         return (Base)this.MemberwiseClone()
     }
}
Run Code Online (Sandbox Code Playgroud)

那么我应该为Clone()派生所有其他类吗?derivedMember也会被Base.Clone()复制吗?

class Derived {
    int derivedMember;  //will this also be copied by base.Clone()?

    //Necessary?
    public new Derived (override Base?) Clone() {
        return (Derived)this.MemberwiseClone();
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

派生(非静态)字段在调用this.MemberwiseClone()其基类时是否也会被复制?

是的,他们可以通过写一个像这样的小测试来保证自己:

private static void Main(string[] args)
{
    Student a = new Student() { Name = "John Doe", Id = 1 };
    Student b = (Student)a.Clone();
}

public class Person
{
    public string Name { get; set; }

    public virtual Person Clone()
    {
        return (Person)this.MemberwiseClone();
    }
}

public class Student:Person
{
    public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

此外,这个问题已在这里得到解答.

我是否需要覆盖(或重写)Clone派生类中的方法?

从技术上讲,它没有必要,但正如您所看到的那样,您必须转换结果,因为方法的返回类型base.Clone()Person.

或者你可以Clone()像这样重写你的基类方法:

public T Clone<T>() where T:Person
{
    return (T)this.MemberwiseClone();
}
Run Code Online (Sandbox Code Playgroud)

然后你需要打电话

Student b = a.Clone<Student>();
Run Code Online (Sandbox Code Playgroud)

在派生类上.所以你只需要在基类中编写一次clone方法.虽然我不确定这是否是最好的解决方案.