3

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

4

4 回答 4

6

您正在传递一个引用(按值)。引用的确切表示是特定于实现的,但在大多数情况下它将是一个指针:)

有关详细信息,请参阅http://yoda.arachsys.com/csharp/parameters.html 。

(我现在正在打电话 - 如果有人可以重新格式化会有所帮助的链接:)

于 2009-03-05T15:19:44.420 回答
1

您最终将传递一个指向对象的指针,其中包含指向 vtable 的指针。嗯,基本上。

于 2009-03-05T15:09:45.940 回答
1

关于在 IL 中调用方法时究竟会发生什么,我已经完成了一系列文章。该系列开始于http://www.simple-talk.com/community/blogs/simonc/archive/2010/11/01/95464.aspx

简而言之,将原生大小的指针压入堆栈,该指针指向对象实例开始处的堆(同步块索引,然后是类型指针,然后是实例的字段值)。CLR 通过类型指针访问 vtable。

于 2011-02-21T23:14:15.620 回答
0

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

顺便说一句,没有“在参数中传递接口”之类的东西。你总是传递一个对象引用,它可以实现一个、一个或多个接口。

于 2009-03-05T15:10:09.730 回答