什么是复制构造函数,以及在C#中应该在什么情况下使用它?

4

实际上,我不理解它的概念,也就是为什么和何时应该使用它。通常情况下,我们可以给类的实例分配值,但为什么要像这样将一个对象发送到另一个对象:

    private void button8_Click(object sender, EventArgs e)
    {
        rectangle r1 = new rectangle(50, 70);
        rectangle r2 = new rectangle(r1);
    }



class rectangle
{
    private int length;
    private int breadth;


    public rectangle(rectangle x)
    {
        length = x.length;
        breadth = x.breadth;
        MessageBox.Show("I'm a Copy Constructor. \n Length= " + length.ToString() + "\n breadth= " + breadth.ToString());

    }
}

这是一个简单的复制矩形的方法。从外部来看,这似乎不可能,因为您的属性是私有的。此外,您还可以修改您的矩形或类似的内容。 - Fruchtzwerg
嗯,我可能在一些库中看到过它的使用,但在C#中这并不常见。复制构造函数是C++编程的明显基石,但在C#中它们只是一种花哨(但正确)的组织方式,用于实现深度克隆(至少这是我对它的期望)。 - Eugene Podskal
这个回答解决了你的问题吗?复制构造函数与Clone()的区别 - Michael Freidgeim
2个回答

1
这是一种从源对象复制成员值来完全或部分初始化对象的可能方法。
在您的情况下,您可以称其为“映射对象”。
或者,矩形类可以实现一个静态方法,例如CreateFrom,它将作为当前构造函数工作,并且也将像工厂方法一样工作:
class rectangle
{
    private int length;
    private int breadth;

    public static rectangle CreateFrom(rectangle x)
    {
        rectangle r = new rectangle();
        r.length = x.length;
        r.breadth = x.breadth;

        return r;
    }
}

也许这样你会发现你的事件处理程序代码更有趣:

private void button8_Click(object sender, EventArgs e)
{
    rectangle r1 = new rectangle(50, 70);
    rectangle r2 = rectangle.CreateFrom(r1);
}

1
CreateFrom 应该有一个返回 r 的语句吗? - user5910494

1
复制构造函数是从C ++ 借来的概念:这个构造函数的唯一目的是从现有对象中进行复制。此外,如果程序员没有提供,则编译器会自动定义C ++中的复制构造函数(隐式复制构造函数)。对于具有特殊复制行为的类,您可以提供复制构造函数。对于其他类,如果该类具有此类型的成员,则隐式复制构造函数将调用您的自定义函数。

总之,在C ++中,复制构造函数是一种简单的复制对象及其成员的方法。诀窍在于您不必明确提供它,并且它受到编译器级别的支持。

据我所知,在C#中没有隐式复制构造函数。而不是使用这些特殊构造函数,您可以在C#中使用克隆。例如,请参见this question

另一个注意事项:结构体在赋值时被复制,但不是递归的。即使没有 no implicit copy constructor,它也只是一个简单的内存复制。

关于C++的复制构造函数,请参考C++14标准第288页第12.8节


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