shown''''''''''''''''''''''''''''''''''''''''''''''''''''''有多糟糕?可以想象,在Google上搜索“is”并不是非常有效。
答案 0 :(得分:20)
有几个选择:
Foo foo = (Foo)bar
as
演员:Foo foo = bar as Foo
is
测试:bool is = bar is Foo
bar
是否可以安全地转换为Foo
(快速),然后实际执行(慢)或抛出异常(真的很慢。)as
运算符需要检查是否可以强制转换bar
,然后执行转换,或者如果无法安全转换,则只返回{{1 }}。null
运算符只检查is
是否可以转换为Foo,并返回bar
。 boolean
测试很快,因为它只执行完整投射操作的第一部分。 is
运算符比经典转换更快,因为如果转换失败则不会抛出异常(这使得它非常适合您合法地期望转换可能失败的情况)。 / p>
如果您只需要知道变量as
是bar
,那么请使用 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)
它应该足够快,无所谓。如果您检查对象的类型足以对性能产生显着影响,则需要重新考虑您的设计