C# Proto3 类 是不可变的吗?

Are C# Proto3 classes immutable?

我正在将引用类型(生成的 Proto3)传递给更新某些属性的方法。当方法 returns 时,属性已经恢复,就好像它不是通过引用传递或者是不可变的。

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
}

srcdest 是按值传递的。当您分配 dest=src 时,您只是将 src 分配给一个曾经指向 dest 的局部变量,这不会影响 dest 本身。

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

public static void Test(MyData src, MyData dest)
{
    dest.Num = src.Num;
}

您选择重用变量名可能会混淆问题。让我们解决这个问题:

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 仍然引用相同的对象,所以你的结果是预期的。

如果您在 Test 中将 dest 设为 ref 变量, 您会看到 foo 发生变化,因为Test 会改变实际引用。