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);

我读过一大堆关于C#对象克隆的代码

出于某些原因,我想使用反射来执行克隆

我有一个包含简单数据的对象(
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
实例的修改,编译器必须将其标记为赋值给只读字段。