Ты не одинок; это смущает многих людей.
Вот как мне нравится думать об этом.
Переменная - это место хранения.
Переменная может хранить что-то определенного типа.
Существует два типа типов: типы значений и ссылочные типы.
Значение переменной ссылочного типа является ссылкой на объект этого типа.
Значением переменной типа value является объект этого типа.
Формальный параметр - это разновидность переменной.
Существует три вида формальных параметров: параметры-значения, параметры ref и параметры out.
Когда вы используете переменную в качестве аргумента, соответствующего параметру значения, значение переменной копируется в хранилище, связанное с формальным параметром. Если переменная имеет тип значения, то создается копия значения. Если переменная имеет ссылочный тип, то создается копия ссылки, и две переменные теперь ссылаются на один и тот же объект. В любом случае создается копия значения переменной.
При использовании переменной в качестве аргумента, соответствующего параметру out или ref , параметр становится псевдонимом для переменной . Когда вы говорите:
void M(ref int x) { ...}
...
int y = 123;
M(ref y);
Вы говорите: «x и y теперь одна и та же переменная ». Они оба относятся к одному и тому же месту хранения .
Я считаю, что гораздо легче понять, чем думать о том, как на самом деле реализован псевдоним, - передав управляемый адрес переменной в формальный параметр.
Это ясно?