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

时间:2014-06-16 02:41:04

标签: c# copy clone

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

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

如果我有

class Base {
     int baseMember;
     public (virtual?) Base Clone() {
         return (Base)this.MemberwiseClone()
     }
}

然后我应该为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();
    }
}

1 个答案:

答案 0 :(得分: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; }
}

此问题已经answered here

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

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

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

public T Clone<T>() where T:Person
{
    return (T)this.MemberwiseClone();
}

然后你需要打电话

Student b = a.Clone<Student>();

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