21

表明'as' 转换比前缀转换快得多,但是'is' 反射呢?有多糟糕?您可以想象,在 Google 上搜索“is”并不是非常有效。

4

4 回答 4

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进行转换,或者如果不能安全地转换,则返回null
  3. is运算符只是检查是否bar可以强制转换为 Foo,并返回一个boolean.

测试is很快,因为它只进行完整铸造操作的第一部分。该as运算符比经典转换更快,因为如果转换失败不会引发异常(这对于您合理预期转换可能失败的情况很有用)。

如果您只需要知道变量bar是否为 a ,Foo则使用is运算符BUT,如果您要测试 if 是否bar为 a Foo,如果是,则转换它,那么您应该使用as运算符。

本质上,每次转换都需要在is内部进行等效的检查,以确保转换有效。因此,如果您在进行is一次完整转换之后进行检查(无论是一次as转换,还是使用经典转换运算符),您实际上是在进行is两次检查,这是一个额外的开销。

于 2008-09-11T22:39:58.000 回答
8

我学到的方法是这样的:

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

比这慢:

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

它足够慢吗?可能不会,但这是一件需要注意的简单事情,你不妨去做。

于 2008-09-11T21:32:05.323 回答
6

"is" 基本上等同于 "isinst" IL 运算符——那篇文章将其描述为快速。

于 2008-09-11T21:27:50.263 回答
2

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

于 2008-09-11T21:28:23.773 回答