题
这个问题在这里已经有答案了:
- C# 'is' 运算符性能 8 个答案
它是 显示 'as' 转换比前缀转换快得多,但是 'is' 反射呢?有多糟糕?正如您可以想象的那样,在 Google 上搜索“is”并不是非常有效。
解决方案
有以下几种选择:
- 这 经典演员阵容:
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
是一个 Foo
然后使用 is
操作员, 但, ,如果你要测试是否 bar
是一个 Foo
, , 如果是这样, 然后投射它, ,那么你应该使用 as
操作员。
基本上每个演员都需要做相当于 is
首先进行内部检查,以确保转换有效。所以如果你做一个 is
检查后进行完整的演员表(或者是 as
强制转换,或使用经典的强制转换运算符)您正在有效地执行 is
检查两次,这是一个轻微的额外开销。
其他提示
我学到的方法是这样的:
if (obj is Foo) {
Foo f = (Foo)obj;
f.doSomething();
}
比这个慢:
Foo f = obj as Foo;
if (f != null) {
f.doSomething();
}
它足够慢吗?可能不会,但是这是一件很容易引起注意的事情,所以您不妨这样做。
“is”基本上等同于“isinst”IL 运算符——该文章将其描述为快速。
它应该足够快,无关紧要。如果您检查对象的类型足以对其性能产生明显影响,则需要重新考虑您的设计
不隶属于 StackOverflow