C# 中的浅拷贝和深拷贝(附示例)2025年2月5日 | 阅读10分钟 理解 C# 中的浅拷贝使用浅拷贝时,当从一个对象创建新对象后,当前对象的值类型字段会被复制到新对象中。但是,对于引用类型,它只会复制引用本身,而不是被引用的对象。对于引用类型,原始对象和克隆对象都指向同一个对象。请查看附带的图表以更好地理解这一点。我们有 Employee 和 Address 类,如下图所示。 此外,您还会看到我们在 Employee 类中指定了一个引用类型属性 empAddress 和两个值类型属性 Name 和 Department。使用浅拷贝时,引用类型的引用地址被复制到新对象中,而值类型属性的值被复制。当在 C# 中使用引用类型属性时,由于浅拷贝,克隆对象和现有对象都将指向相同的内存地址。 ![]() 附带的图表说明了我们首先创建一个名为 emp1 的对象,然后用一些值对其进行初始化。接下来,我们使用 GetClone 函数构造第二个对象,即 emp2。内存表示显示,值类型字段(Name 和 Department)被复制并保存在不同的内存位置。另一方面,引用类型字段 empAddress 继续指向相同的旧内存地址。这表明 Address 对象现在由 emp1 和 emp2 引用。因此,如果我们对员工地址进行任何修改,它们将相互影响。 注意:C# 中的“浅拷贝”描述了一种复制技术,其中对象的引用被复制,但对象本身并未复制。在浅拷贝中,如果原始对象引用了其他对象(例如数组或类对象),则原始对象和副本将引用相同的对象。何时在 C# 中使用浅拷贝?当原始对象和复制对象之间共享引用是可取或允许的时,浅拷贝可能很有用。在 C# 中,您可能希望在以下情况下使用浅拷贝:
理解 C# 中的深拷贝深拷贝是通过复制现有对象的字段来将其转换为新对象的过程。如果字段是成本类型的一部分,则可以执行该字段的逐位复制。如果字段是引用类型,则会创建被引用对象的新副本。请查看下图以更好地理解。 此示例与我们之前介绍的浅拷贝示例相同。但是,您可以看到 Employee 和 Address 类现在都使用了 GetClone 函数。 我们从 Employee 类的 GetClone 方法中调用 Address 类的 GetClone 方法。这是 C# 中深拷贝的实现。 ![]() 因为 Name 和 Department 属性是值类型,如上图所示,它会复制该属性并将其保存在其他地方。对于 empAddress(一个引用类型属性),深拷贝中存在引用类型字段的克隆,该克隆将保存在不同的位置。因此,要记住的一点是,在深拷贝中,字段类型是引用还是值都无关紧要。每次都会创建整个文件的副本并保存在单独的内存位置。 理解 C# 中深拷贝的示例以下示例演示了 C# 中深拷贝的使用。以下示例代码是自解释的,请仔细阅读注释行以更好地理解。 输出 ![]() 注意:递归地生成一个新对象,该对象是旧对象及其所有内容(包括其包含的任何其他对象)的副本,称为 C# 中的“深拷贝”。通过这种方式,对一个对象所做的修改不会影响另一个对象,反之亦然。通常,您必须手动复制对象中的每个字段才能实现深拷贝,确保也深拷贝任何引用类型。何时在 C# 中使用深拷贝?使用深拷贝可以保证复制对象和原始对象之间完全独立,这意味着对一个对象所做的修改不会影响另一个对象。在以下情况下,C# 中的深拷贝是合适的,甚至是必需的:
C# 中浅拷贝和深拷贝的区别使用浅拷贝和深拷贝从现有对象创建克隆对象。浅拷贝与其他方法的区别在于,当从原始对象创建对象克隆时,原始对象中的值类型字段会复制到新对象中。但是,对于引用类型属性,它只会复制引用,而不是实际对象。因此,对于引用类型,原始对象和复制对象指向相同的内存地址。 相反,使用深拷贝时,将使用原始对象生成克隆,并将原始对象的字段复制到新生成的克隆中。如果字段属于值类型,则将执行字段的逐位复制。如果字段是引用类型,则将创建被引用对象的新副本。在深拷贝的情况下,与浅拷贝不同,引用类型属性在原始对象和复制对象中都存储在不同的内存位置。 因此,即使您可以在类中声明两种方法,您也必须根据应用程序要求选择使用浅拷贝或深拷贝。有两种方法可用:浅拷贝和深拷贝。请查看以下示例以更好地理解这一点。在这里,我们在 Employee 类中有两种方法。克隆对象将使用 GetShallowCopy 方法进行浅拷贝,使用 GetDeepCopy 方法进行深拷贝。 通常,如果我们尝试将一个对象复制到另一个对象,它们将共享相同的内存位置。除非存在值类型字段,否则我们通常使用赋值运算符 = 复制引用而不是对象。此操作将始终复制引用而不是实际对象。例如,如果 P1 引用内存地址 5000,则 P2 也将引用相同的地址。因此,如果地址 5000 处存储的数据值发生更改,P1 和 P2 都将显示相同的数据。 在 C# 中,浅拷贝和深拷贝都指对象复制;它们之间唯一的区别是复制的深度。下面是它们区别的详细分析: 定义
引用类型
修改的影响
执行
成就
用例
限制
结论总之,在 C# 中很好地处理对象复制需要理解浅拷贝和深拷贝背后的思想,尤其是在处理复杂的对象结构时。您对浅拷贝与深拷贝的决定将取决于您的独特需求。在内存考虑至关重要且允许共享引用的情况下,浅拷贝可能适用。 当您需要对象的独立副本及其层次结构时,深拷贝是更好的选择。在 C# 中处理复杂数据结构时,正确实施这些复制过程可以保护对象实例的完整性并防止意外的副作用。 下一主题C# 中的单例设计模式及其示例 |
我们请求您订阅我们的新闻通讯以获取最新更新。