То, что почти всегда забыто, это то, что класс не передается по ссылке, ссылка на класс передается по значению.
Это важно. Вместо копирования всего класса (передача по значению в стереотипном смысле) копируется ссылка на этот класс (я стараюсь не говорить «указатель»). Это 4 или 8 байтов; гораздо более приемлемый, чем копирование всего класса, и фактически означает, что класс передается «по ссылке».
На данный момент метод имеет собственную копию ссылки на класс . Присвоение этой ссылки в рамках метода (метод переназначает только свою собственную копию ссылки).
Разыменование этой ссылки (как, например, в разговоре с учениками) будет работать так, как вы ожидаете: вы увидите базовый класс, если не измените его, чтобы посмотреть на новый экземпляр (что вы и делаете в своем неудачном тесте). ).
Использование ключевого слова ref
эффективно передает саму ссылку по ссылке (указатель на указатель типа вещи).
Как всегда, Джон Скит представил очень хорошо написанный обзор:
http://www.yoda.arachsys.com/csharp/parameters.html
Обратите внимание на часть «Справочные параметры»:
Эталонные параметры не передают значения переменных, используемых в
вызов члена функции - они сами используют переменные.
Если метод назначает что-то для ссылки ref
, то на копию вызывающего абонента также влияют (как вы заметили), потому что они смотрят на такую же ссылку на экземпляр в памяти (в отличие от каждого, имеющего свою собственную копию).