2009-03-05 1 views
3

Если вы передаете интерфейс или экземпляр класса в качестве параметра, передаем ли мы много объектов или полный vtable, потому что, как только вы вызываете метод в экземпляре, ему необходимо перезаписать vtable и вызвать соответствующее право?
Как это работает?в .NET при передаче экземпляра класса/интерфейса в качестве параметра передаете один объект или полный файл vtable

ответ

1

Вы в конечном счете передаете указатель на объект, содержащий указатель на таблицу vtable. Ну, в основном.

0

Это детали реализации, так что я думаю, что вы не должны полагаться на это! :)

кстати, нет такого понятия, как «передавая интерфейс в параметре». Вы всегда передаете ссылку на объект, которая может реализовать ни один, один или несколько интерфейсов.

+0

Следите за сообщениями в блоге Раймонда Чена через несколько лет, потому что он напишет о каком-то старом приложении, которое действительно полагалось на это! – OregonGhost

+0

@OregonGhost: ahah, очень верно! – Brann

6

Вы передаете ссылку (по значению). Точное представление ссылки специфично для реализации, но в большинстве случаев это будет указатель :)

См. http://yoda.arachsys.com/csharp/parameters.html для получения более подробной информации.

(я по телефону в данный момент - если кто-то может переформатировать ссылку, которая будет полезна :)

1

Я сделал целый ряд сообщений о том, что именно происходит при вызове метода в IL. Серия начинается с http://www.simple-talk.com/community/blogs/simonc/archive/2010/11/01/95464.aspx

Короче говоря, указатель на натуральном размере помещается в стек, который указывает на кучу в начале экземпляра объекта (индекс блока синхронизации, за которым следует указатель типа, за которым следует значения полей экземпляра). CLR получает значение vtable через указатель типа.

Смежные вопросы