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
}
src
和 dest
是按值传递的。当您分配 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
。它根本不会更改 dest
或 src
引用的对象的值。所以调用函数中的 foo
和 bar
仍然引用相同的对象,所以你的结果是预期的。
如果您在 Test
中将 dest
设为 ref
变量, 则 您会看到 foo
发生变化,因为Test
会改变实际引用。
我正在将引用类型(生成的 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
}
src
和 dest
是按值传递的。当您分配 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
。它根本不会更改 dest
或 src
引用的对象的值。所以调用函数中的 foo
和 bar
仍然引用相同的对象,所以你的结果是预期的。
如果您在 Test
中将 dest
设为 ref
变量, 则 您会看到 foo
发生变化,因为Test
会改变实际引用。