我正在将引用类型(生成的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
}
答案 0 :(得分:1)
src
和dest
按值传递。分配dest=src
时,只是将src
分配给用于指向dest
的局部变量,这不会影响dest
本身。
您当然可以在方法中通过修改其成员来修改dest
,例如:
public static void Test(MyData src, MyData dest)
{
dest.Num = src.Num;
}
答案 1 :(得分:0)
您选择重用变量名可能会使问题感到困惑。让我们解决这个问题:
MyData foo = new MyData();
foo.Num = 1;
MyData bar = new MyData();
bar.Num = 2;
Console.WriteLine(foo.Num); // num = 1
Test(bar, foo);
Console.WriteLine(foo.Num); // num still equals 1
public static void Test(MyData src, MyData dest)
{
// dest.Num = 1 here
dest = src;
// dest.Num = 2 now
}
现在让我们看一下Test
的作用。它将dest
的值重新分配给src
。它根本不会更改dest
或src
引用的对象的值。因此,调用函数中的foo
和bar
仍引用相同的对象,因此可以预期得到结果。
如果您在dest
中将ref
设置为Test
变量,那么然后您会看到foo
发生了变化,因为Test
会更改实际参考。