Это часто сбивает с толку, и я думаю, что документация MSDN на самом деле немного "понятна, только если уже известна".То есть, это правильно, но это действительно имеет смысл, только если вы уже поняли концепцию.
Вот как я об этом думаю.
Обычный параметр делает копию значение аргумент .Когда вы говорите:
static int M(int z) { z = z + 1; return z; }
...
int x = 123;
int y = M(x);
Это так же, как вы сказали:
int x = 123;
int z = x; // make a copy of x
z = z + 1;
int y = z;
Параметр ref или out создает псевдоним для существующей переменной .Когда вы говорите
static void N(ref int q) { q = q + 1; }
...
int x = 123;
N(x);
Это то же самое, что сказать:
int x = 123;
// MAGIC: q is now an another name for variable x
q = q + 1;
q
и x
являются двумя разными именами , которые относятся к та же переменная .Увеличение q
также увеличивает x
, потому что они одинаковы.z
и x
в предыдущем примере - это два разных имени , которые ссылаются на две разные переменные .Увеличение z
не меняет x
.
Подводя итог: «out» и «ref» просто означают «не создают новую переменную, скорее, временно создают второе имя для существующей переменной».
Это теперь понятно?
ОБНОВЛЕНИЕ: Я не сказал, в чем разница между "out" и "ref".Разница проста.На стороне «вызывающего», «ref» должен быть определенно назначенной переменной до вызова метода.«Вне» не должно быть.На стороне «вызываемого» «ref» может быть прочитан до того, как он записан, но «out» должен быть записан до того, как он будет прочитан.Кроме того, перед выходом из метода должен быть записан «out».