我有一个需要快速性能的程序。在其内部循环之一中,我需要测试对象的类型,以查看其是否从某个接口继承。
一种方法是使用CLR的内置类型检查功能。最优雅的方法可能是’is’关键字:
if (obj is ISpecialType)
另一种方法是为基类提供我自己的虚拟GetType()函数,该函数返回预定义的枚举值(在我的情况下,实际上,我只需要一个布尔值)。该方法将很快,但不太优雅。
我听说有一个专门针对’is’关键字的IL指令,但这并不意味着它在转换为本地程序集时执行速度很快。谁能对“是”与其他方法的性能分享一些见解?
更新: 感谢您提供所有明智的答案!答案中似乎有几个有用的观点:安德鲁(Andrew)关于“是否”自动执行演员表的观点是必不可少的,但是Binary Worrier和Ian收集的性能数据也非常有用。如果对其中一个答案进行编辑以包括 所有 这些信息,那将是非常不错的。
is如果一旦检查类型将其转换为该类型,使用会损害性能。 is实际上将对象转换为您要检查的类型,因此任何后续的转换都是多余的。
is
如果仍然要进行投射,这是一种更好的方法:
ISpecialType t = obj as ISpecialType; if (t != null) { // use t here }