Если вы передаете интерфейс или экземпляр класса в качестве параметра, передаем ли мы много объектов или полный vtable, потому что, как только вы вызываете метод в экземпляре, ему необходимо перезаписать vtable и вызвать соответствующее право?
Как это работает?в .NET при передаче экземпляра класса/интерфейса в качестве параметра передаете один объект или полный файл vtable
ответ
Вы в конечном счете передаете указатель на объект, содержащий указатель на таблицу vtable. Ну, в основном.
Это детали реализации, так что я думаю, что вы не должны полагаться на это! :)
кстати, нет такого понятия, как «передавая интерфейс в параметре». Вы всегда передаете ссылку на объект, которая может реализовать ни один, один или несколько интерфейсов.
Вы передаете ссылку (по значению). Точное представление ссылки специфично для реализации, но в большинстве случаев это будет указатель :)
См. http://yoda.arachsys.com/csharp/parameters.html для получения более подробной информации.
(я по телефону в данный момент - если кто-то может переформатировать ссылку, которая будет полезна :)
Я сделал целый ряд сообщений о том, что именно происходит при вызове метода в IL. Серия начинается с http://www.simple-talk.com/community/blogs/simonc/archive/2010/11/01/95464.aspx
Короче говоря, указатель на натуральном размере помещается в стек, который указывает на кучу в начале экземпляра объекта (индекс блока синхронизации, за которым следует указатель типа, за которым следует значения полей экземпляра). CLR получает значение vtable через указатель типа.
- 1. Как вы передаете Container.DataItem в качестве параметра?
- 2. «Ожидаемый]» ошибка при передаче объекта в качестве параметра JS функций
- 3. Invalid исключения литого при передаче в качестве параметра объекта
- 4. Поведение блока при передаче в качестве аргумента
- 5. Когда нужно передавать объект в качестве параметра против экземпляра?
- 6. Исключительное исключение ссылки при передаче EditText в качестве параметра
- 7. Как определить аннотации полей при передаче в качестве параметра?
- 8. Как игнорировать область видимости при передаче метода в качестве параметра?
- 9. Javascript область видимости функции при передаче объекта в качестве параметра
- 10. Производный функтор, не вызываемый при передаче в качестве параметра шаблона
- 11. Создание объекта неизменяемым при его передаче в качестве параметра
- 12. Переменная теряется при передаче в качестве параметра в setTimeout()
- 13. Угловой 2, передавая полный объект в качестве параметра
- 14. Производительность питона при передаче больших данных в качестве параметра функции
- 15. «Неизвестное преобразование» из const при передаче «this» в качестве параметра
- 16. Любопытство о передаче функции в качестве параметра -
- 17. Скопировано ли NSString при передаче в качестве параметра блока?
- 18. При передаче объекта в качестве параметра используется больше памяти?
- 19. В Rust, как вы передаете функцию в качестве параметра?
- 20. Процедура, возвращающая нулевые строки при передаче where в качестве параметра
- 21. Почему не работает console.log при передаче в качестве параметра forEach?
- 22. Получение ошибки при передаче выражения в качестве параметра fucntion
- 23. Почему одно свободное измерение при передаче массивов в качестве параметра?
- 24. MySqlException при передаче имени таблицы в качестве параметра для MySqlCommand
- 25. неправильного использования пустого выражения при передаче функции в качестве параметра
- 26. jQuery: Как вы передаете $ (this) в качестве параметра функции?
- 27. Отправка экземпляра памяти объекта в качестве параметра
- 28. В C# 3.5, как вы передаете, какой метод вызывать объект в качестве параметра
- 29. Pass объект в качестве параметра
- 30. дочерний объект в качестве параметра
Следите за сообщениями в блоге Раймонда Чена через несколько лет, потому что он напишет о каком-то старом приложении, которое действительно полагалось на это! – OregonGhost
@OregonGhost: ahah, очень верно! – Brann