C# 用C克隆一个简单的盒式类型#
我读过一大堆关于C#对象克隆的代码 出于某些原因,我想使用反射来执行克隆 我有一个包含简单数据的对象(C# 用C克隆一个简单的盒式类型#,c#,clone,C#,Clone,我读过一大堆关于C#对象克隆的代码 出于某些原因,我想使用反射来执行克隆 我有一个包含简单数据的对象(int,string,List,List,DateTime,double或其他简单值类型)。对象是通过简单的装箱创建的 object ob = 5; 现在使用类似或失败的代码都是以同样的方式。在包含基本数据的对象上使用此克隆代码,它们将返回相同的对象。以下示例代码将返回与ob1相同的ob2 object ob1 = 5; object ob2 = DoSomeClone(ob1);
int
,string
,List
,List
,DateTime
,double
或其他简单值类型)。对象是通过简单的装箱创建的
object ob = 5;
现在使用类似或失败的代码都是以同样的方式。在包含基本数据的对象上使用此克隆代码,它们将返回相同的对象。以下示例代码将返回与ob1相同的ob2
object ob1 = 5;
object ob2 = DoSomeClone(ob1);
如何为此类类型编写简单的克隆代码
我在这里也搜索了很多,所以我想知道这个问题是否重复
说明:
我有一个公共对象,它保存一些数据和引用(数据的来源)。普通数据本身(数据类型见上文)保存在对象中。对于基本类型,它只是装箱的值
在某些情况下,我需要外部类的副本,因为我希望将此函数提供给可能更改数据的模拟。对象本身是通过构造函数克隆的。现在我也需要一份数据副本。使用任何克隆函数都会创建一个副本,而不是值的克隆。注释中给出了答案:原始类型在装箱时是不可变的,因此不需要克隆强>
因此,在其中存储一个新值(即int)将创建一个新对象 你能告诉我们你为什么要这么做吗?无法更改装箱的基元类型,因为它是不可变的。而且,为了清楚起见,您不能有装箱列表,除非您所说的列表类型与
list
不同<代码>列表不是值类型。您想做什么List
和string
绝对不是简单的类型,它们也不会被装箱-它们是引用类型,因此不需要装箱。另一方面,值类型在传递时会被复制。@Kirill这对原语来说并不重要,因为它们是不可变的。如果OP的意思是可写的,那就有意义了structs@PanagiotisKanavos:虽然原语本身是不可变的,但在某些语言中(不是C#,而是通过反射)可以更改“框中的值”。因此,虽然这是一个不寻常的请求,但在某些情况下它是合理的。因此,不需要克隆。谢谢,我会补充这一点,你甚至可以去掉“装箱时”。给定int i=1;i=2
,一个新的int
实例正在覆盖原始的int
,因此原始的int
永远不会被修改,而是不再被修改。这对于int
来说有点哲学性,因为这与修改原始int
之间没有区别,但在struct S{public readonly int i;}代码>和变量s1、s2代码>,s1=s2代码>是完全有效的。如果该赋值是对原始S
实例的修改,编译器必须将其标记为赋值给只读字段。