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