在.NET中,当您将类实例/接口作为参数传递时,是否传递了一个对象或完整的vtable

时间:2009-03-05 15:06:15

标签: .net oop clr cil virtual-functions

如果您将接口或类的实例作为参数传递,我们是否传递了许多对象或完整的vtable,因为一旦您在实例上调用方法,它需要递归vtable并调用适当的方法?
这是如何工作的?

4 个答案:

答案 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)

这是一个实现细节,所以我认为你不应该依赖它!:)

顺便说一下,没有“在参数中传递接口”这样的东西。您总是传递一个对象引用,它可以实现无,一个或多个接口。