【问题标题】:What is copy constructor and when it should be used in c#?什么是复制构造函数,什么时候应该在 c# 中使用它?
【发布时间】:2016-02-27 20:23:07
【问题描述】:

其实我不明白它的概念,意思是为什么以及何时应该使用它。通常,我们可以为类的实例赋值,但为什么我们应该像这样将一个对象发送给另一个对象:

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

    }
}

【问题讨论】:

  • 这是一种复制矩形的简单方法。从外部看,这是不可能的,因为您的财产是私有的。你也可以修改你的矩形或类似的东西。
  • 好吧,我可能已经看到它在某些库中使用过,但这在 C# 中并不常见。复制构造函数是 C++ 编程的明显基石,但在 C# 中,它们只不过是一种花哨(但正确)的方式来组织 deep cloning(至少这是我所期望的)。

标签: c# constructor copy-constructor


【解决方案1】:

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

总结:C++ 中的复制构造函数是一种复制对象及其成员的简单方法。诀窍是您不必显式提供一个,它在编译器级别受支持。

据我所知,C# 中没有隐式复制构造函数。您可以在C# 中使用克隆来代替这个特殊的构造函数。例如,请参阅this question

另一个注意事项:structs 在分配时被复制,但不是递归的。就算有no implicit copy constructor,也只是简单的内存拷贝。

对于 C++ 复制构造函数,请参阅 section 12.8, page 288 in the C++14 standard 示例。

【讨论】:

    【解决方案2】:

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

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

    或者,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);
    }
    

    【讨论】:

    • CreateFrom 不应该有返回 r 吗?
    猜你喜欢
    • 2011-06-16
    • 2013-06-17
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多