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

Can I treat a reference type as a value type here, or do I need to clone?

考虑以下方法:

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
}

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

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

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

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

随着 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);
}

该方法将return两个不同的引用,代表同一实体的不同版本。

默认情况下,记录是不可变的,它们旨在按原样使用。