C#中’is’reflection的性能特征是什么?

它表明 ‘as’铸造比前缀铸造快得多,但是’是’reflection怎么样? 有多糟糕? 您可以想象,在Google上搜索“is”并不是非常有效。

有几个选择:

  1. 经典演员Foo foo = (Foo)bar
  2. as cast操作符Foo foo = bar as Foo
  3. is测试bool is = bar is Foo

  1. 经典演员需要检查bar可以安全地转换为Foo (快速),然后实际执行(较慢),或抛出exception(非常慢)。
  2. as运算符需要检查是否可以强制转换,然后执行转换,或者如果无法安全转换,则它只返回null
  3. is运算符只检查bar可以转换为Foo,并返回一个boolean

测试很快,因为它只执行完整的转换操作的第一部分。 as运算符比经典强制转换更快,因为如果强制转换失败,则不会抛出exception(这使得它适用于您合法地期望强制转换可能失败的情况)。

如果你只需要知道变量bar是否为Foo那么使用is运算符, 但是如果你要测试bar是否为Foo ,如果是, 则抛出它 ,然后你应该使用as运算符。

基本上每个演员都需要在内部进行等同的检查,以确保演员表有效。 因此,如果你进行了一次检查,然后进行了完整的强制转换(使用as cast,或使用经典的强制转换操作符),那么你实际上是在进行两次检查,这是一个额外的开销。

我学到它的方式是:

 if (obj is Foo) { Foo f = (Foo)obj; f.doSomething(); } 

比这慢:

 Foo f = obj as Foo; if (f != null) { f.doSomething(); } 

是否足够缓慢? 可能不是,但要注意这是一件很简单的事情,你不妨这样做。

“is”基本上等同于“isinst”IL运算符 – 该文章描述的速度很快。

它应该足够快,无所谓。 如果要检查对象的类型是否足以对性能产生显着影响,则需要重新考虑设计