-1

我将引用类型(生成的 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
}
4

2 回答 2

1

src并按dest值传递。当你分配时dest=src,你只是分配src给一个曾经指向的局部变量dest,它不会影响dest自己。

当然,dest如果您愿意,您可以通过修改其成员来修改方法内部,例如:

public static void Test(MyData src, MyData dest)
{
    dest.Num = src.Num;
}
于 2018-12-31T18:37:31.750 回答
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作用。它重新分配destto的值src。它不会改变任何一个destsrc引用的对象的值。所以在调用函数中仍然引用相同的对象,所以你的结果是预期的foobar

如果您在 中创建了dest一个ref变量Test那么您会看到foo更改,因为Test会更改实际参考。

于 2018-12-31T18:38:38.413 回答