C# 核心 3.1 ByRef 和 ByVal

Mer*_*tez 5 c# pass-by-reference pass-by-value asp.net-core

我想在 C# 核心中设置一个等于其他对象值的对象,而不是通过引用!

x.len=10;
val y=x;
y.len=x.len*2;
Run Code Online (Sandbox Code Playgroud)

我希望y.len设置为20,并x.len保持不变,但两者y.len和x.len是20,我正在寻找一种方式来断开x和y。

我记得在VB6 中我们有像ByRef和ByVal这样的东西,它们使我们能够控制这个东西,C# Core 3.x 中是否有类似的东西?

Mri*_*boj 2

我想设置一个对象等于c#核心中的其他对象值,而不是通过引用!

为此,您需要一个像结构这样的值类型,它不是在堆上分配的,或者对于引用类型,您需要一个深复制而不是浅复制。在.Net C#中,所有类默认分配在堆上,都是引用类型,当传递对象时,它要么按值引用(这是指向同一内存的另一个指针),要么按引用引用(指向指针的指针,使用 ref并输出关键字)

我们来回顾一下代码

var y=x;,查看结果,可以安全地假设 y 和 x 具有相同类型,但都是引用类型。因此,如果value type这不适合您,请执行以下操作之一:

通过以下方式创建深层副本:

  1. 序列化,最好是二进制,因为它紧凑,对于非循环对象层次结构序列化效果很好,当您反序列化时,它是一个新对象
  2. 使用复制构造函数,将对象逐个属性、逐个字段复制到新的分配中

一旦你这样做了,你会发现与浅复制不同的是,当修改属性时,一个对象不会修改另一个对象