C#中"是"反射的性能特征是什么?

时间:2020-03-05 18:51:51  来源:igfitidea点击:

结果表明" as"转换比前缀转换快得多,但是"反射"又如何呢?有多糟?可以想象,在Google上搜索"是"并不是十分有效。

解决方案

回答

" is"基本上等效于" isinst" IL运算符-该运算符将其描述为快速运算符。

回答

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

回答

我的学习方式是:

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

比这慢:

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

足够慢才重要吗?可能不是,但是要注意这是一件很简单的事情,我们最好也这样做。

回答

有几种选择:

  • 经典演员:Foo foo =(Foo)bar
  • as强制转换运算符:Foo foo = bar as Foo
  • is测试:bool is = bar is Foo
  • 经典的转换需要检查" bar"是否可以安全地转换为" Foo"(快速),然后实际执行(较慢)或者引发异常(真的很慢)。
  • as运算符需要检查是否可以转换bar,然后进行转换,或者如果不能安全地转换bar,则仅返回null。
  • " is"运算符只是检查是否可以将" bar"强制转换为Foo,然后返回" boolean"。

" is"测试是快速的,因为它只执行完整转换操作的第一部分。 as运算符比经典强制转换更快,因为如果强制转换失败,它不会引发异常(这对于我们合理地期望强制转换可能失败的情况而言非常有用)。

如果只需要知道变量bar是否为Foo,则使用is运算符,但要测试bar是否为Foo,如果是,则进行强制转换它,那么我们应该使用as运算符。

基本上,每个转换都需要在内部进行等效的" is"检查,以确保转换有效。因此,如果先执行" is"检查,然后执行完整的强制转换(" as"强制转换,或者使用经典的强制转换运算符),则实际上将进行两次" is"检查,这会产生一点额外的开销。