Если у вас есть класс и конструктор, который принимает объект в качестве входного параметра - этот объект передается по ссылке или по значению?
Все параметры передаются по значению в C #, если параметр не помечен out
или ref
.
Это огромный источник путаницы. Я изложу вещи немного более явно.
Все параметры имеют свои скопированные значения, если параметр не помечен out
или ref
. Для типов значений это означает, что создается копия передаваемого значения. Для ссылочных типов это означает, что копия ссылки сделана. Для этой последней точки значение ссылочного типа является ссылкой.
И верно ли предположить, что для методов класса входные параметры объекта по умолчанию передаются по значению, если не используется ключевое слово ref
?
Опять же, все параметры передаются по значению в C #, если параметр не помечен out
или ref
. Для параметра, отмеченного ref
, в метод передается ссылка на параметр, и теперь вы можете рассматривать этот параметр как псевдоним. Таким образом, когда вы говорите
void M(ref int m) { m = 10; }
int n = 123;
M(ref n);
вы можете думать о m
в M
как о псевдониме n
. То есть m
и n
- это просто два разных имени для одного и того же места хранения.
Это очень отличается от
string s = "Hello, world!";
string t = s;
В этом случае s
и t
не являются одинаковыми для одного и того же места хранения. Это две разные переменные, которые ссылаются на один и тот же объект.
А как насчет ключевого слова `out? Означает ли это, что оно передается по ссылке?
Единственная разница между ref
и out
заключается в том, что ref
требует инициализации переменной перед ее передачей.