每次将对象转换为接口时,C#都会执行字典查找吗?我认为它不得不。可以实现数百个接口的通用对象 - > GetType() - >通过名称(或数字ID,不会处于可预测的位置)获取接口 - >从数组获取方法指针并保存到已铸造的对象C#接口铸造...字典查找?
回答
我不认为这与运行时间有任何关系......它在编译阶段都处理完毕。
问题是关于场景“对象x =任何; IFoo y =(IFoo)x;”编译器不知道x是否实际实现了IFoo,但它可能会使编译器将其推迟到运行时。 –
@PinnyM:好的,我会的。但我不确定你为什么认为这看起来不正确。是否有一些技术可以确定一个对象是否实现了一个不涉及查找该事实的接口?信息从哪里来? –
@EricLippert:可以使用已知的内存位置(管理并构建为程序集加载)而不是字典哈希或列表迭代查找它。我曾假设类型确实有一个具体的定义,可以在运行时直接由对象引用。这不是这种情况吗? – PinnyM
假设我们有:
object x = whatever;
IFoo y = (IFoo)x;
您在提的是,必须有某种方式在运行时,没有编译器,确定是否是成功还是抛出一个无效的转换异常正确。
运行时如何执行的具体细节是实现细节,它是复杂的。运行时使用一些相当复杂的技术来确保在普通情况下该测试速度很快。此外,CLR的一个有趣特征是参考身份和价值认同是一回事;如果类型测试成功,则存储在x和y中的位是相同的。 (这在C++中通常不是这种情况;相反,对象的不同“视图”会导致不同的指针)。这意味着为了有效地处理接口方法的调度,必须实现其他机制。
我没有足够的CLR内部知识或专业知识来精确描述所有这些机制如何工作。也许你可以问一个更具体的问题,如果你想更好的答案。
- 1. 字典铸造
- 2. 铸造字典
- 3. c#通用接口铸造
- 4. Ada接口铸造?
- 5. 铸造通用接口和类在C#
- 6. C#铸造与使用接口
- 7. C# - 铸造的对象的接口
- 8. 来自接口的C#铸造类型
- 9. C#通用接口铸造问题
- 10. C#自动铸造接口方法
- 11. 铸造LINQ查询结果到接口
- 12. 接口继承和铸造
- 13. 接口和铸造列表
- 14. Java的铸造接口类
- 15. 铸造通用接口
- 16. 铸造的DirectX接口
- 17. 铸造到继承接口
- 18. `Iterable`的接口铸造
- 19. 在C#中铸造通用词典#
- 20. 麻烦铸造字典到阵列
- 21. 夫特2型铸造字典
- 22. objective c 2.0 - 关键字铸造与非关键字铸造
- 23. C++类铸造
- 24. C#铸造
- 25. 铸造在C#
- 26. Java泛型在接口之间铸造
- 27. 对其实施接口的铸造类
- 28. 铸造泛型类型接口约束
- 29. 事件聚合 - 铸造工件接口
- 30. 使用铸造的接口类型
??为什么会这样工作? – PinnyM
那么它是如何工作的? –
哈哈抱歉,我没有看到其他评论!我只是没有看到任何其他方式,它会工作... –