【问题标题】:What is the difference between copying and cloning?复制和克隆有什么区别?
【发布时间】:2011-01-13 02:41:34
【问题描述】:

在编程中是否有明确的参考?

我看到很多人将深度复制和克隆称为同一件事。这是真的?

它依赖于语言吗?

一个小问题,但它让我很困扰......

【问题讨论】:

  • 我认为对于它们的相对含义没有任何明确的共识。

标签: c# oop


【解决方案1】:

这些概念没有正式的定义,至少没有一个涵盖所有语言的定义。

但通常是什么:

  • 克隆 - 基于现有事物创建新事物。
  • 复制 - 从存在的东西复制到其他东西(也已经存在)。

【讨论】:

    【解决方案2】:

    是的,有区别。就语言依赖而言,有些语言可以进行所有的 Shallow、Deep、Lazy 复制。有些只做浅拷贝。所以是的,它有时取决于语言。

    现在,以数组为例:

    int [] numbers = { 2, 3, 4, 5};
    int [] numbersCopy = numbers;
    

    “numbersCopy”数组现在包含相同的值,但更重要的是,数组对象本身与“numbers”数组指向相同的对象引用。

    所以如果我要这样做:

      numbersCopy[2] = 0;
    

    以下语句的输出是什么?

      System.out.println(numbers[2]);
    
      System.out.println(numbersCopy[2]);
    

    考虑到两个数组都指向同一个引用,我们会得到:

    0

    0

    但是,如果我们想用自己的引用创建第一个数组的不同副本怎么办?那么在这种情况下,我们会想要克隆数组。这样一来,每个数组现在都将拥有自己的对象引用。让我们看看它是如何工作的。

      int [] numbers = { 2, 3, 4, 5};
    
      int [] numbersClone = (int[])numbers.clone();
    

    “numbersClone”数组现在包含相同的值,但在这种情况下,数组对象本身指向的引用与“numbers”数组不同。

    所以如果我要这样做:

      numbersClone[2] = 0;
    

    以下语句现在的输出是什么?

      System.out.println(numbers[2]);
    
      System.out.println(numbersClone[2]);
    

    你猜对了:

    4

    0

    Source

    【讨论】:

    • 您的第一个示例 (numbersCopy) 既不是副本也不是克隆,而是参考。
    【解决方案3】:

    最简洁:

    • 复制:复制到现有实例(浅或深)
    • 克隆:复制到新实例(始终深)

    由于开发人员草率地互换它们,因此没有达成共识;但是可以根据以下内容游说上述内容:

    1. 词源学(生物学)暗示“浅克隆”的概念是荒谬的,因为在基因上并不相同;克隆意味着为了传播实体的完整性。
    2. 从历史上看,复制意味着复制到现有介质上(复制书籍或绘画等)。例如,影印件将图像复制到现有纸张上;如果有人能以某种方式克隆一张纸,那么结果将是一张新纸。
    3. 可以“复制”对象引用,但永远不能“克隆”对象引用。

    【讨论】:

      【解决方案4】:

      我会说复制和克隆是类似的术语。您可能应该知道的唯一一件事是您会获得浅拷贝和深拷贝。浅拷贝仅在根级别复制对象,而深拷贝将生成对象及其所有子对象的副本。

      【讨论】:

      • 我同意。我认为总的来说,这些术语在开发人员之间可以互换使用,至少在我参与的项目中是这样。最好始终限定深度,即浅拷贝/克隆深拷贝/克隆
      【解决方案5】:

      在 C++ 领域,“克隆”通常用于深度复制多态类的对象。

      在 Java/C# 中,我怀疑这些术语可以互换使用。

      【讨论】:

        猜你喜欢
        • 2013-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-03
        • 2018-09-12
        • 2015-11-23
        • 2013-02-13
        相关资源
        最近更新 更多