2

每次将对象转换为接口时,C# 是否都会进行字典查找?我认为它必须。

可以实现数百个接口的通用对象 -> GetType() -> 按名称(或数字 ID,不会在可预测的位置)获取接口 -> 从数组中获取方法指针并保存到转换对象

4

2 回答 2

7

假设我们有:

object x = whatever;
IFoo y = (IFoo)x;

您正确地指出,运行时而不是编译器必须以某种方式确定该方法是否成功或抛出无效的强制转换异常。

运行时如何做到这一点的确切细节是一个实现细节,而且很复杂。运行时使用许多相当复杂的技术来确保此测试在常见情况下是快速的。此外,CLR 的一个有趣特性是引用标识和值标识是同一事物。如果类型测试成功,则存储在 x 和 y 中的位相同。(这在 C++ 中通常不是这种情况;相反,对象的不同“视图”会导致不同的指针。)这意味着必须实现额外的机制才能有效地处理接口方法的分派。

我没有足够的 CLR 内部知识或专业知识来准确地向您描述所有这些机制是如何工作的。如果你想要一个更好的答案,也许你可以问一个更具体的问题。

于 2012-12-27T17:27:07.653 回答
0

我不认为这与运行时有任何关系。它都是在编译阶段处理的。

于 2012-12-27T16:58:38.223 回答