C#中'is'反射的性能特征是什么?

时间:2008-09-11 21:25:23

标签: c# reflection

shown''''''''''''''''''''''''''''''''''''''''''''''''''''''有多糟糕?可以想象,在Google上搜索“is”并不是非常有效。

4 个答案:

答案 0 :(得分:20)

有几个选择:

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

    1. 经典演员需要检查bar是否可以安全地转换为Foo(快速),然后实际执行(慢)或抛出异常(真的很慢。)
    2. as运算符需要检查是否可以强制转换bar,然后执行转换,或者如果无法安全转换,则只返回{{1 }}。
    3. null运算符只检查is是否可以转换为Foo,并返回bar
    4. boolean 测试很快,因为它只执行完整投射操作的第一部分。 is 运算符比经典转换更快,因为如果转换失败则不会抛出异常(这使得它非常适合您合法地期望转换可能失败的情况)。 / p>

      如果您只需要知道变量asbar,那么请使用 Foo 运算符 BUT ,如果您要测试is是否为bar,如果是,然后投了,那么您应该使用 Foo < / strong>运营商。

      基本上每个演员都需要在内部进行相当于as的检查,以确保演员表有效。因此,如果您进行is检查,然后进行完整投射(is强制转换,或使用经典投射操作符),您实际上会进行两次as检查,这是一个轻微的额外开销。

答案 1 :(得分:7)

我学到它的方式是:

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

慢于此:

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

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

答案 2 :(得分:6)

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

答案 3 :(得分:3)

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