相关疑难解决方法(0)

C#'是'运营商的表现

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

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

if (obj is ISpecialType)
Run Code Online (Sandbox Code Playgroud)

另一种方法是给基类我自己​​的虚拟GetType()函数,它返回一个预定义的枚举值(在我的情况下,实际上,我只需要一个bool).这种方法会很快,但不那么优雅.

我听说有一个专门针对'is'关键字的IL指令,但这并不意味着它在转换为本机程序集时执行速度很快.任何人都可以分享一些关于'是'与其他方法的表现的见解吗?

更新: 感谢所有明智的答案!似乎在答案中分散了几个有用的观点:安德鲁关于'是'自动执行演员表的观点是必不可少的,但Binary Worrier和Ian收集的表演数据也非常有用.如果编辑其中一个答案以包含所有这些信息,那就太棒了.

c# clr performance gettype

90
推荐指数
7
解决办法
5万
查看次数

在C#中使用IsAssignableFrom和"is"关键字

在尝试学习Unity时,我一直看到以下代码覆盖GetControllerInstanceMVC:

if(!typeof(IController).IsAssignableFrom(controllerType)) { ... }
Run Code Online (Sandbox Code Playgroud)

在我看来,这基本上是一种非常复杂的写作方式

if(controllerType is IController) { ... }
Run Code Online (Sandbox Code Playgroud)

我理解,存在之间的细微差别isIsAssignableFrom,即IsAssignableFrom不包括投转换,但我在努力了解实际情况下这种差别的含义.

什么时候选择IsAssignableFrom结束有意义is?它会有什么不同GetControllerExample

if (!typeof(IController).IsAssignableFrom(controllerType))
      throw new ArgumentException(...);
return _container.Resolve(controllerType) as IController;
Run Code Online (Sandbox Code Playgroud)

c# reflection asp.net-mvc casting unity-container

51
推荐指数
4
解决办法
1万
查看次数