首页 > 解决方案 > 我可以在这里将引用类型视为值类型,还是需要克隆?

问题描述

考虑以下方法:

public (MySpecialType one, MySpecialType two) ReturnTwoSeparateObjects()
{
   MySpecialType before = new MySpecialType();
   MySpecialType after = before;
   after.MyProperty = "A value";
   return (before, after); // These will be the same object, pointless returning twice
}

这将返回相同的对象,因为分配的after只是对分配给的内存的相同引用before。我明白这一点,但我想在属性更改之前和之后返回对象的表示。

我知道我可能可以before使用序列化或其他方法进行深度克隆,但这似乎是一种非常繁重的方法(我可能在这方面错了,这是一个假设)。假设我想避免深度克隆,这里有什么方法可以将before其视为值类型吗?

标签: c#asp.net-core-3.1value-typereference-type

解决方案


好吧,您不需要使用序列化,但您确实需要创建单独的对象。您需要克隆的深度取决于类型 - 例如,您不需要克隆任何不可变类型。(您可以在代码中引入的不变性越多,这就越容易。)

没有“将引用类型视为值类型”的概念,但即使有,它也只会自然地执行浅层克隆,所以你不会好太多。


推荐阅读