在 C# 中复制一个对象
本教程将介绍在 C# 中复制对象的方法。
在 C# 中使用 MemberWiseClone()
方法复制对象
不幸的是,没有内置的方法可以在 C# 中创建对象的单独副本。在下面的代码示例中证明了这种现象。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace copy_an_object {
class myClass {
public String test;
}
class Program {
static void Main(string[] args) {
myClass a = new myClass();
a.test = "This is a test";
myClass b = a;
b.test = "This is not a test";
Console.WriteLine(a.test);
Console.WriteLine(b.test);
}
}
}
输出:
This is not a test
This is not a test
我们两次都得到相同的输出,因为 C# 中的类的实例是指向特定内存位置的引用类型变量。由于 C# 的面向对象特性,新指针 b
也指向 a
的存储位置。
如果要为 b
创建一个单独的存储位置,则必须依靠某些用户定义的方法。MemberWiseClone()
方法用于在 C# 中创建调用对象的值的单独副本。MemberWiseClone()
函数的返回类型是 object。以下代码示例向我们展示了如何使用 C# 中的 MemberWiseClone()
函数创建类对象的单独副本。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace copy_an_object {
class myClass {
public String test;
public object Clone() {
return this.MemberwiseClone();
}
}
class Program {
static void Main(string[] args) {
myClass a = new myClass();
a.test = "This is a test";
myClass b = (myClass)a.Clone();
b.test = "This is not a test";
Console.WriteLine(a.test);
Console.WriteLine(b.test);
}
}
}
输出:
This is a test
This is not a test
这次从输出中可以清楚地看到每个类对象都有一个单独的副本。我们在 myClass
类的 Clone()
函数内部实现了 MemberWiseClone()
函数。Clone()
函数返回类对象的单独副本。Clone()
函数的返回值被类型转换为 myClass
,并由 b
类对象指向。
使用 C# 中的参数化构造方法复制对象
我们可以创建一个参数化的类构造函数以在 C# 中实现相同的目标。我们可以将先前的类对象传递给新类对象的构造函数,并从中复制所有值。以下代码示例向我们展示了如何使用 C# 中的参数化构造函数方法创建类对象的单独副本。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace copy_an_object {
class MyClass {
public String test;
public MyClass() {}
public MyClass(MyClass other) {
test = other.test;
}
}
class Program {
static void Main(string[] args) {
MyClass a = new myClass();
a.test = "This is a test";
MyClass b = new MyClass(a);
b.test = "This is not a test";
Console.WriteLine(a.test);
Console.WriteLine(b.test);
}
}
}
输出:
This is a test
This is not a test
我们为 MyClass
类创建了一个参数化的构造函数,该构造函数接受 MyClass
类的对象并从中复制 test
字符串。在主函数中,我们创建了 MyClass
类的对象 a
,并将其传递给了 b
的构造函数。
相关文章
在 C# 中获取组合框的选定值
发布时间:2024/01/20 浏览次数:156 分类:编程语言
-
本教程展示了如何在 C# 中获取 ComboBox 的选定值。在本教程中,你将学习在 C# 中获取 ComboBox 的选定文本和值的不同方法。获取 ComboBox 控件的选定值的最常用方法是使用 C# 在按钮单击事件中获取
在 C# 中创建一个 UDP 服务器
发布时间:2024/01/20 浏览次数:161 分类:编程语言
-
在本文中,我们将学习如何在 C# 中创建 UDP 服务器。本文将展示如何在 C# 中创建一个简单的 UDP 服务器。在 C# 中创建一个 UDP 服务器
C# 中的 LINQ 分组
发布时间:2024/01/20 浏览次数:55 分类:编程语言
-
LINQ 中的 group by 用于按 C# 中的某个公共值对对象序列进行分组 C# 中的 LINQ 分组 LINQ 将类似 SQL 的查询功能与 C# 中的数据结构集成在一起。
使用 C# 在 LINQ 查询中按多列分组
发布时间:2024/01/20 浏览次数:169 分类:编程语言
-
这是一篇关于 LINQ 查询的使用以及我们如何使用 LINQ 查询按列分组的文章。本文简要介绍了使用 C# 进行的 LINQ 查询。此外,它还讨论了如何使用 LINQ 查询按多列对结果进行分组。
在 C# 中捕获多个异常
发布时间:2024/01/20 浏览次数:137 分类:编程语言
-
有两种主要方法可用于捕获 C# 中的多个异常,即 Exception 类和 catch 子句中的 if 语句。使用 C# 中的 Exception 类捕获多个异常 Exception 类用于表示 C# 中的一般异常。
C# 中为无效参数或参数引发的异常类型
发布时间:2024/01/20 浏览次数:78 分类:编程语言
-
本教程将教你如何在 C# 中为无效参数或参数抛出不同类型的异常。异常提供有关 C# 程序中的运行时错误或预期不会发生或违反系统/应用程序约束的条件的信息。在本教程中,你将学习与无效参