Являются ли классы C # Proto3 неизменяемыми? - PullRequest
0 голосов
/ 31 декабря 2018

Я передаю ссылочный тип (сгенерированный 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 голосов
/ 31 декабря 2018

Ваш выбор повторного использования имен переменных может сбить с толку проблему.Давайте исправим это:

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 a ref переменную в Test, тогда вы бы увидели foo изменение, потому что Test изменит фактическую ссылку.

0 голосов
/ 31 декабря 2018

src и dest передаются по значению.Когда вы присваиваете dest=src, вы просто присваиваете src локальной переменной, которая раньше указывала на dest, что не влияет на dest.

Конечно, вы можете изменитьdest внутри метода путем изменения его членов, если вы хотите, например:

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