C# 中的 Object.MemberwiseClone()

17 Mar 2025 | 4 分钟阅读

C# 语言中的 Object.MemberwiseClone() 方法用于创建类中对象的浅拷贝。浅拷贝意味着当前对象的字段值被复制到一个新对象中。它主要用于复制对象的状态。我们可以使用这个方法来得到相同的结果,而不用将每个值从一个对象单独复制到另一个新对象。

MemberwiseClose() 执行的是浅拷贝。如果对象中的字段是引用,那么只有引用被复制,但它们指向的对象并没有。这意味着对被引用对象的更改将反映在原始实例和克隆实例中。如果对象中的字段是值类型,那么这些值会直接复制到克隆实例中,但在原始值中所做的更改不会反映在克隆实例中。

通常将 MemberwiseClone() 与 ICloneable 接口结合使用;需要注意的是,ICloneable.Clone() 的默认实现也使用 MemberwiseClone() 并执行浅拷贝。

语法

它具有以下语法:

此方法不接受任何参数。此方法返回一个新对象的引用。返回类型是 Object,因为 MemberwiseClone() 将创建对象的浅拷贝。

MemberwiseClone() 可能比其他对象复制方法更快,因为它不调用构造函数。如果对引用对象的更改不打算影响原始实例和克隆实例,则浅拷贝行为可能会导致意外行为。如果需要对包含引用对象的对象进行深拷贝,则需要一些额外的逻辑和自定义实现。它只复制非静态字段,不复制非公共成员。如果一个类有需要克隆的非公共成员,则使用自定义的克隆方法。

示例

让我们用一个简单的 C# 程序来说明 Object.MemberwiseClone()

输出

Object.MemberwiseClone() in C#

说明

这个程序使用 MemberwiseClone 方法来克隆方法。该程序包含诸如 “Name”(代表人的姓名)、“Age”(代表人的年龄)、“originalPerson”(此实例代表原始的人)和 “copiedPerson”(代表原始人的浅拷贝)等变量。

该程序包含像 Clone() 这样的方法,它实现了 ICloneable 接口,该接口使用 MemberwiseClone() 方法创建当前“person”对象的浅拷贝并将其作为对象返回。

程序的控制流

首先,创建 person 类的对象,并将其命名为 originalPerson,姓名为 “Ramu”,年龄为 30。在 originalPerson 上调用 Clone 方法。之后,MemberwiseClone() 创建一个浅拷贝,并将此对象存储在 copiedPerson 变量中。最后,程序打印出原始人和复制人的详细信息。

示例

让我们看一个处理引用类型的 C# 程序。

输出

Object.MemberwiseClone() in C#

说明

这个程序将创建对象的深拷贝。它既复制引用也复制值。程序中的变量有:DepartmentName 代表部门名称,Name 代表员工姓名;Department 是一个引用类型,代表员工所属的部门;originalEmployee 代表 Employee 类的实例;copiedEmployee 是代表原始对象副本的对象。

Employee 类实现了 ICloneable 接口,提供了一个用于创建对象副本的方法(Clone)。该实现依赖于 MemberwiseClone() 来执行实际的克隆操作。程序打印出原始员工和复制员工的详细信息,展示了复制的员工与原始员工具有相同的状态。它还演示了对复制员工中引用的部门的更改会影响两个实例。

结论

总之,Object.MemberwiseClone() 是一个多功能的方法,它提供了一种创建对象浅拷贝的便捷方式,在简单性和性能之间取得了平衡。理解其特性和用例对于在将其整合到 C# 代码中时做出明智的决策至关重要。