2012-12-27 142 views
2

每次将对象转换为接口时,C#都会执行字典查找吗?我认为它不得不。可以实现数百个接口的通用对象 - > GetType() - >通过名称(或数字ID,不会处于可预测的位置)获取接口 - >从数组获取方法指针并保存到已铸造的对象C#接口铸造...字典查找?

+2

??为什么会这样工作? – PinnyM

+0

那么它是如何工作的? –

+0

哈哈抱歉,我没有看到其他评论!我只是没有看到任何其他方式,它会工作... –

回答

0

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

+0

问题是关于场景“对象x =任何; IFoo y =(IFoo)x;”编译器不知道x是否实际实现了IFoo,但它可能会使编译器将其推迟到运行时。 –

+0

@PinnyM:好的,我会的。但我不确定你为什么认为这看起来不正确。是否有一些技术可以确定一个对象是否实现了一个不涉及查找该事实的接口?信息从哪里来? –

+0

@EricLippert:可以使用已知的内存位置(管理并构建为程序集加载)而不是字典哈希或列表迭代查找它。我曾假设类型确实有一个具体的定义,可以在运行时直接由对象引用。这不是这种情况吗? – PinnyM

7

假设我们有:

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

您在提的是,必须有某种方式在运行时,没有编译器,确定是否是成功还是抛出一个无效的转换异常正确。

运行时如何执行的具体细节是实现细节,它是复杂的。运行时使用一些相当复杂的技术来确保在普通情况下该测试速度很快。此外,CLR的一个有趣特征是参考身份和价值认同是一回事;如果类型测试成功,则存储在x和y中的位是相同的。 (这在C++中通常不是这种情况;相反,对象的不同“视图”会导致不同的指针)。这意味着为了有效地处理接口方法的调度,必须实现其他机制。

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