考虑以下方法:
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);
}
该方法将返回两个不同的引用,表示同一实体的不同版本。
默认情况下,这些记录是不可变的,并且它们是这样使用的。