这个问题在这里已经有答案了:

它是 显示 'as' 转换比前缀转换快得多,但是 'is' 反射呢?有多糟糕?正如您可以想象的那样,在 Google 上搜索“is”并不是非常有效。

有帮助吗?

解决方案

有以下几种选择:

  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是一个 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 运算符——该文章将其描述为快速。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top