它表明'as' 转换比前缀转换快得多,但是'is' 反射呢?有多糟糕?您可以想象,在 Google 上搜索“is”并不是非常有效。
Ben Collins
问问题
4584 次
4 回答
20
有几个选项:
- 经典演员阵容:
Foo foo = (Foo)bar
as
演员表操作员:Foo foo = bar as Foo
is
测试:_bool is = bar is Foo
- 经典转换需要检查是否
bar
可以安全地转换为(快速),然后Foo
实际执行(较慢),或者抛出异常(非常慢)。 as
操作员需要检查是否可以转换,然后bar
进行转换,或者如果不能安全地转换,则返回null
。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 回答