我有一个需要快速性能的程序.在其内部循环之一中,我需要测试对象的类型以查看它是否继承自某个接口.
一种方法是使用CLR的内置类型检查功能.最优雅的方法可能是'is'关键字:
if (obj is ISpecialType)
Run Code Online (Sandbox Code Playgroud)
另一种方法是给基类我自己的虚拟GetType()函数,它返回一个预定义的枚举值(在我的情况下,实际上,我只需要一个bool).这种方法会很快,但不那么优雅.
我听说有一个专门针对'is'关键字的IL指令,但这并不意味着它在转换为本机程序集时执行速度很快.任何人都可以分享一些关于'是'与其他方法的表现的见解吗?
更新: 感谢所有明智的答案!似乎在答案中分散了几个有用的观点:安德鲁关于'是'自动执行演员表的观点是必不可少的,但Binary Worrier和Ian收集的表演数据也非常有用.如果编辑其中一个答案以包含所有这些信息,那就太棒了.
我正在尝试提供一个NotOfType具有可读调用语法的实现.NotOfType应该是补充,OfType<T>并因此产生所有非类型的元素T
我的目标是实现一个方法OfType<T>,就像在这个片段的最后一行一样调用它:
public abstract class Animal {}
public class Monkey : Animal {}
public class Giraffe : Animal {}
public class Lion : Animal {}
var monkey = new Monkey();
var giraffe = new Giraffe();
var lion = new Lion();
IEnumerable<Animal> animals = new Animal[] { monkey, giraffe, lion };
IEnumerable<Animal> fewerAnimals = animals.NotOfType<Giraffe>();
Run Code Online (Sandbox Code Playgroud)
但是,我无法想出一个支持特定调用语法的实现.
这是我到目前为止所尝试的:
public static class EnumerableExtensions
{
public static IEnumerable<T> NotOfType<T>(this IEnumerable<T> sequence, Type type) …Run Code Online (Sandbox Code Playgroud)