c#是否具有类似于c ++的任何复制控制概念

时间:2012-12-13 14:58:10

标签: c# c++ constructor

C++中,我们有复制构造函数析构函数重载= ,它们一起被称为复制控件< /强>

我的问题是:

  1. copy constructorC#用于初始化对象时argument传递给initializing returning {1}}(分配) function来自C++ 的对象,如 {{1 }}

  2. 当我们初始化)任何对象分配给同一类型的另一个对象时,是否会调用隐式重载的=运算符函数?

4 个答案:

答案 0 :(得分:1)

在C#中,您不能重载赋值运算符。

在托管内存世界(大多数情况下),析构函数并没有真正意义。实际上有一个等价物(终结者)但你很少需要使用它们。

复制构造函数是针对某些类创建的,但它的完成程度几乎与C ++中的一样。它永远不会被语言隐式调用,只有在您手动调用它时才会使用它。

答案 1 :(得分:1)

  1. 否:引用对象通过引用传递,而值对象则逐字节复制。您可以创建自己的“复制构造函数”,但是您有责任明确地调用它们。
  2. 您不能重载赋值运算符
  3. 为了公平对待C#,由于底层的垃圾收集内存模型,C ++复制控制的复杂性都不是必需的。例如,在复制对象时,您不需要控制动态分配对象的所有权,因为您可以根据需要随意添加对动态对象的引用。

答案 2 :(得分:1)

没有。如果要提供复制机制,可以通过实现ICloneable接口来实现:http://msdn.microsoft.com/en-us/library/system.icloneable.aspx

答案 3 :(得分:1)

C#没有复制构造函数的概念,也没有重载operator=的概念。在C#对象中只存在,并且在代码中使用句柄。句柄可以“按值”复制以在整个代码中使用,但这是一个所谓的“浅”副本,对象本身仍然相同,它们都指向相同的内存(间接)。

复制构造函数类似于托管世界中的深层复制,您可以通过ICloneable实现这一点,但它完全是手动的,直到对象的实现来编写它。您也可以通过序列化(boost方式)或通过任何间接方式实现它。

作为最后一点,由于对象生命周期是非确定性的(当GC任意决定它们应该死亡时它们会死亡),也没有析构函数这样的东西。最接近的是终结器(当您的对象被收集时称为非确定性)和IDisposable模式(以及using),它们可以让您对最终化进行控制。毋庸置疑,它们很少被使用。

编辑:我应该指出,虽然复制构造函数没有等价物,但通过implicit具有“类型转换”构造函数,此时精确的名称会让我失望。 / p>