【发布时间】:2018-12-31 18:29:29
【问题描述】:
我将一个引用类型(生成的 Proto3)传递给一个更新某些属性的方法。当方法返回时,属性已恢复,就好像它不是通过引用传递或不可变一样。
MyData dest = new MyData();
dest.Num = 1;
MyData src = new MyData();
src.Num = 2;
Console.WriteLine(dest.Num); // num = 1
Test(src, dest);
Console.WriteLine(dest.Num); // num still equals 1
public static void Test(MyData src, MyData dest)
{
// dest.Num = 1 here
dest = src;
// dest.Num = 2 now
}
【问题讨论】:
-
您刚刚更改了
dest参数的值。这是一个按值传递的参数——你没有使用ref。如果改为使用dest.Num = 3;,则会更改dest引用的对象的内容。请参阅pobox.com/~skeet/csharp/parameters.html - 请注意,这与 Protobuf 无关,这只是 C# 的一般工作方式。 -
实际上我昨天刚刚阅读了您的文章,试图解决这个问题。只是为了验证,值类型和引用类型是按值传递的,除非您使用
ref关键字。但是,您仍然可以在没有ref的情况下修改引用类型引用的数据。您只是不能更改实际参考本身吗? -
是的,完全正确。如果你还没有读过pobox.com/~skeet/csharp/references.html,我也会读。
标签: c# immutability proto3