в .NET, когда вы передаете экземпляр / интерфейс класса в качестве параметра, вы передаете один объект или полную таблицу - PullRequest
3 голосов
/ 05 марта 2009

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

Ответы [ 4 ]

6 голосов
/ 05 марта 2009

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

Подробнее см. http://yoda.arachsys.com/csharp/parameters.html.

(Я сейчас разговариваю по телефону - если бы кто-то мог переформатировать ссылку, это было бы полезно:)

1 голос
/ 22 февраля 2011

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

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

1 голос
/ 05 марта 2009

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

0 голосов
/ 05 марта 2009

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

Кстати, нет такой вещи, как "передача интерфейса в параметре". Вы всегда передаете ссылку на объект, который не может реализовать ни один, ни один, ни несколько интерфейсов.

...