Давайте немного вернемся назад и начнем с переменных.
Переменные всегда содержат определенную информацию. Для типов значений содержащаяся информация представляет собой целое значение напрямую. Для ссылочных типов содержащаяся информация является только ссылкой на какое-то другое место в памяти, где живет реальное значение.
В .Net вы можете делать вид, что переменные действительно передаются или возвращаются из функций только одним способом: по значению. Забудьте прохождение по ссылке & mdash; это просто запутает вещи. Когда вы передаете переменную по значению, вся информация , содержащаяся непосредственно в переменной, копируется в функцию. Хитрость заключается в том, чтобы понять, что это значит для ссылочных типов, и просто взять копию ссылки.
Я могу продемонстрировать простой пример кода:
void Test(int x, dynamic y)
{
x = 3;
y.a = "four";
y.b = "five";
y = new {a = "six", b = "seven"}; // this will have no effect outside the function
}
int x = 2; // value type
var y = new {a = "one", b="two"}; //reference type
// both x and y are passed by value, but y is a reference type so the reference itself is copied
Test(x, y);
Console.WriteLine(x); //writes 2, because the test function is working with a copy
Console.WriteLine(y.a); //writes four
Console.WriteLine(y.b); //writes five
В случае ссылочных типов вы можете принудительно вызвать «передачу по ссылке», но вы никогда не должны делать это , если вы действительно не знаете, что происходит. Это будет выглядеть примерно так:
void Test(ref dynamic y)
{
y = new {a = "three", b="four"};
}
var y = new {a = "one", b="two"};
Test(y);
Console.WriteLine(y.a); //prints one
Console.WriteLine(y.b); //prints two
Выход по-прежнему «один» и «два», потому что функция заменила ссылку на локальную переменную. Код, вызвавший функцию, по-прежнему имеет ссылку на исходную ячейку памяти и выводит исходное значение.