如果您将接口或类的实例作为参数传递,我们是否传递了许多对象或完整的vtable,因为一旦您在实例上调用方法,它需要递归vtable并调用适当的方法?
这是如何工作的?
答案 0 :(得分:6)
您正在传递引用(按值)。引用的确切表示是特定于实现的,但在大多数情况下它将是一个指针:)
有关详细信息,请参阅http://yoda.arachsys.com/csharp/parameters.html。
(我现在正打电话 - 如果有人可以重新格式化有用的链接:)
答案 1 :(得分:1)
您最终会传递一个指向该对象的指针,该对象包含指向vtable的指针。好吧,基本上。
答案 2 :(得分:1)
我已经完成了一系列关于在IL中调用方法时究竟发生了什么的帖子。该系列从http://www.simple-talk.com/community/blogs/simonc/archive/2010/11/01/95464.aspx
开始简而言之,将本机大小的指针推入堆栈,指向对象实例开头的堆(同步块索引,后跟类型指针,后跟实例的字段值)。 CLR通过类型指针进入vtable。
答案 3 :(得分:0)
这是一个实现细节,所以我认为你不应该依赖它!:)
顺便说一下,没有“在参数中传递接口”这样的东西。您总是传递一个对象引用,它可以实现无,一个或多个接口。