一尘不染

C#是操作员的绩效

c#

我有一个需要快速性能的程序。在其内部循环之一中,我需要测试对象的类型,以查看其是否从某个接口继承。

一种方法是使用CLR的内置类型检查功能。最优雅的方法可能是’is’关键字:

if (obj is ISpecialType)

另一种方法是为基类提供我自己的虚拟GetType()函数,该函数返回预定义的枚举值(在我的情况下,实际上,我只需要一个布尔值)。该方法将很快,但不太优雅。

我听说有一个专门针对’is’关键字的IL指令,但这并不意味着它在转换为本地程序集时执行速度很快。谁能对“是”与其他方法的性能分享一些见解?

更新: 感谢您提供所有明智的答案!答案中似乎有几个有用的观点:安德鲁(Andrew)关于“是否”自动执行演员表的观点是必不可少的,但是Binary
Worrier和Ian收集的性能数据也非常有用。如果对其中一个答案进行编辑以包括 所有 这些信息,那将是非常不错的。


阅读 270

收藏
2020-05-19

共1个答案

一尘不染

is如果一旦检查类型将其转换为该类型,使用会损害性能。 is实际上将对象转换为您要检查的类型,因此任何后续的转换都是多余的。

如果仍然要进行投射,这是一种更好的方法:

ISpecialType t = obj as ISpecialType;

if (t != null)
{
    // use t here
}
2020-05-19