什么是复制构造函数以及何时应该在c#中使用?

时间:2016-02-27 20:23:07

标签: c# constructor copy-constructor

实际上我并不理解它的概念,这意味着应该采用它的原因和时间。通常,我们可以为类的实例赋值,但为什么我们应该将对象发送到另一个对象,如下所示:

    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());

    }
}

2 个答案:

答案 0 :(得分:1)

这是一种完全或部分初始化对象复制成员的可能方法。来自源对象的值。

在您的情况下,您可以将其称为映射对象

或者,rectangle类可以实现像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 :(得分:1)

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

摘要:C++中的复制构造函数是复制对象及其成员的简单方法。诀窍在于您不必显式提供,并且在编译器级别受支持。

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

另一个注意事项:structs被复制到分配上,但不是递归的。即使有no implicit copy constructor,它也只是一个简单的内存副本。

对于C ++拷贝构造函数,请参阅section 12.8, page 288 in the C++14 standard例如。