C#Proto3类是不可变的吗?

时间:2018-12-31 18:29:29

标签: c# immutability proto3

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

2 个答案:

答案 0 :(得分:1)

srcdest按值传递。分配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。它根本不会更改destsrc引用的对象的值。因此,调用函数中的foobar仍引用相同的对象,因此可以预期得到结果。

如果您在dest中将ref设置为Test变量,那么然后您会看到foo发生了变化,因为Test会更改实际参考。