如何在C#中复制一个类的实例

27
有没有办法在C#中复制一个对象?类似这样的操作:
var dupe = MyClass(original);

我希望它们是相等的,这样所有的数据成员都是相同的,但不共享同一内存位置。

2
问题不够清晰。您正在谈论对象而不是类,并且应该澄清您想要的语义,正如Groo所说的那样。https://dev59.com/r3VC5IYBdhLWcg3wykUt - Daniel Daranas
一种可能性是使用反射来创建一个通用方法,为您执行此操作:http://pmichaels.net/2016/03/04/dynamically-copy-a-class-from-one-instance-to-another-using-reflection/ - Paul Michaels
13个回答

1

可以考虑这样做:

public class MyClass 
{
    int i;
    double d;
    string something;

    public MyClass(int i, double d) {}

    public MyClass Clone()
    {
        return (new MyClass(i, d));
    }
}

或者,如果您在构建新对象时还需要复制其他通常不知道的内容:

    public MyClass CloneMore()
    {
        MyClass obj = new MyClass(i, d);
        obj.something = this.something;
        return (obj);
    }

使用以下方式进行调用:

MyClass us = them.Clone();

~~~


我想我写了一个继承自Object的类,叫做MemberwiseClone,它使用反射来获取/设置所有字段/属性。 - user34537

1

一种可能性是克隆它。您必须实现接口ICloneableClone方法。


3
请注意,所讨论的接口已被弃用。它从未清楚地表示“深拷贝”还是“浅拷贝”;一个具有不明确契约的接口无法被准确实现或可靠使用。(下次设计框架基类库时,请不要重蹈覆辙! :) ) - Eric Lippert

1

你是指像C++中存在的复制构造函数吗?

C#中不存在这种构造函数。 你可以编写自己的(这很繁琐),或者编写一个“Clone”方法,该方法使用序列化创建一个新实例,该实例具有与原始类完全相同的值。

您可以对当前实例进行序列化,反序列化它,并返回反序列化结果。缺点是您的类必须是可序列化的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接