Как классы могут передаваться по ссылке в .NET?

Как мы все знаем, классы в .NET передаются по ссылке, а структуры — по значению.

В небезопасном коде вы можете иметь указатели на структуры, но не на классы, поскольку они перемещаются сборщиком мусора. Например, когда у вас есть указатель на массив, вы должны поместить его либо в оператор fixed (если вы выделили в куче), либо в stackalloc (для размещения в стеке).

С учетом сказанного, как классы могут передаваться по ссылке, если они перемещаются сборщиком мусора?


person James Ko    schedule 28.08.2015    source источник
comment
@SamAxe Все параметры по умолчанию передаются по значению, включая объект   -  person johnny 5    schedule 28.08.2015
comment
@johnny5: эээ, да. Моя ошибка в этой части. Я отрегулирую это.   -  person Sam Axe    schedule 28.08.2015
comment
классы — это языковая конструкция, не имеющая значения за пределами исходного кода. Класс компилируется в тип. Тип может быть создан как объект и передан.   -  person Sam Axe    schedule 28.08.2015


Ответы (2)


Что перемещает GC; GC фиксирует. Так как сборщик мусора в любом случае должен найти все ссылки на объект (чтобы проверить, может ли он пройти сборщик мусора), изменить эти ссылки, чтобы они указывали на новый объект, является небольшим дополнительным шагом. адрес.

person Mark Brackett    schedule 28.08.2015

Вы можете думать об экземпляре типа класса как об дескрипторе, тогда ссылка на дескриптор будет просто еще одним косвенным обращением (своего рода указателем на дескриптор), ограниченным по объему вызовом метода. Поскольку сам объект остается скрытым за ручкой, его можно перемещать без какого-либо видимого эффекта.

person alexm    schedule 28.08.2015