【问题标题】:Cloning a a simple boxed type with C#用 C# 克隆一个简单的盒子类型
【发布时间】:2019-01-09 23:57:40
【问题描述】:

我已经阅读了一堆关于 C# 对象克隆的代码。

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

我有一个包含简单数据的对象(intstringList<string>List<int>DateTimedouble 或其他简单值类型)。该对象是通过简单的装箱创建的。

object ob = 5;  

现在使用this DeepCloneHelperthis one 之类的代码都会以同样的方式失败。在包含原始数据的对象上使用此克隆代码,它们将返回相同的对象。以下示例代码将返回 ob2,即 ReferenceEqual to ob1

object ob1 = 5;  
object ob2 = DoSomeClone(ob1);

如何为此类类型编写简单的克隆代码?

我也在这里搜索了很多,所以如果这个问题是重复的,我很抱歉。

说明: 我有一个通用对象,它包含一些数据和引用(数据的来源)。纯数据本身(数据类型见上文)保存在一个对象中。对于原始类型,它只是装箱的值。

在某些情况下,我需要外部类的副本,因为我想将此函数提供给可能会更改数据的模拟。对象本身是通过构造函数克隆的。现在我也需要一份数据副本。使用任何克隆函数都会创建一个副本,而不是值的克隆。

【问题讨论】:

  • 您能告诉我们为什么需要这样做吗?您无法更改被装箱的原始类型,因为它是不可变的。
  • 为了清楚起见,你不能有一个装箱列表,除非你说的列表类型与List<T> 不同。 List<T> 不是值类型。
  • 你想做什么? Liststring 绝对不是简单类型,它们也不会被装箱——它们是引用类型,所以它们不需要装箱。另一方面,值类型在传递时会被复制。
  • @Kirill 对于原语来说并不重要,因为它们是不可变的。如果 OP 意味着 writable structs
  • @PanagiotisKanavos:虽然原语本身是不可变的,但在某些语言(不是 C#,除了通过反射)中可以更改“框中的值”。因此,虽然这是一个不寻常的请求,但在某些情况下是合理的。

标签: c# clone


【解决方案1】:

在 cmets 中给出了答案:原始类型在装箱时是不可变的,因此无需克隆!

因此在其中存储一个新值(即 int)将创建一个新对象!

【讨论】:

  • 因此不需要克隆。
  • 谢谢,我会添加这个
  • 您甚至可以取出“盒装时”。给定int i = 1; i = 2;,一个新的int 实例将覆盖原来的int,因此原来的int 永远不会被修改,而是不再被修改。这对于int 来说有点哲学,因为这与修改原始int 之间没有区别,但在例如struct S { public readonly int i; }; 和变量 S s1, s2;s1 = s2; 完全有效。如果该分配是对原始 S 实例的修改,则编译器必须将其标记为分配给只读字段。
猜你喜欢
  • 2015-06-16
  • 2015-09-25
  • 2021-03-10
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 2011-11-15
  • 2022-01-20
  • 2013-01-06
相关资源
最近更新 更多