我可以在这里将引用类型视为值类型吗?还是需要克隆



考虑以下方法:

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#9的出现,您可以选择将MySpecialType定义为record而不是class,并执行以下操作:

public (MySpecialType one, MySpecialType two) ReturnTwoSeparateObjects()
{
var before = new MySpecialType();
var after = before with { MyProperty = "A value" };
return (before, after);
}

该方法将返回两个不同的引用,表示同一实体的不同版本。

默认情况下,这些记录是不可变的,并且它们是这样使用的。

相关内容

最新更新