Ответ 1
Ключевое слово ref
вызывает Передача по ссылке > семантика - то есть , если переменная повторно назначена в вызываемой функции, назначьте переменную в вызывающем.
Очевидно, что это работает только в том случае, если переменная 2 (которая может быть перепривязана) напрямую передается как аргумент и не будет работать, если передается произвольное выражение. В этом случае this
не является переменной, а является специальным выражением, которое нельзя повторно назначить и поэтому не может быть использовано.
Таким образом, это сработает: (Но, пожалуйста, просмотрите другие ответы и продолжайте читать, почему это, вероятно, не требуется и/или просто глупо.)
var me = this;
var slave = new ClassB(ref me);
Однако, Pass by ref
не следует путать с Pass by Object [Shareing] 1 семантикой. Pass by Object означает, что , если объект передан, этот объект передается: объект не копируется/клонирован/не дублируется. Если объект мутирован, объект мутируется. Все Типы ссылок имеют семантику Pass by Object в С#, если только ref
или out
. (Ключевое слово class
объявляет новый ссылочный тип, как в случае с сообщением).
С другой стороны, Типы значений (например, struct
), включая int
и Guid
и KeyValuePair<K,V>
, имеют Передача по значению семантика - в этом случае выполняется копия и, таким образом, , если значение изменено, изменяется только значение struct (которое является копией).
Счастливое кодирование
1 Под С#/.NET достигает Pass by Object, передавая ссылку на объект по значению. Однако правильные правила правильно описывают наблюдаемую семантику и эффекты.
2 В отличие от С#, который позволяет использовать переменные только с ref
, VB.NET позволяет использовать свойства. Компилятор VB.NET автоматически создает временную переменную и неявные инструкции чтения/записи свойства во время компиляции.