C#中’is’reflection的性能特征是什么?
它表明 ‘as’铸造比前缀铸造快得多,但是’是’reflection怎么样? 有多糟糕? 您可以想象,在Google上搜索“is”并不是非常有效。
有几个选择:
- 经典演员 :
Foo foo = (Foo)bar
-
as
cast操作符 :Foo foo = bar as Foo
-
is
测试 :bool is = bar is Foo
- 经典演员需要检查
bar
可以安全地转换为Foo
(快速),然后实际执行(较慢),或抛出exception(非常慢)。 -
as
运算符需要检查是否可以强制转换,然后执行转换,或者如果无法安全转换,则它只返回null
。 -
is
运算符只检查bar
可以转换为Foo,并返回一个boolean
。
测试很快,因为它只执行完整的转换操作的第一部分。 as
运算符比经典强制转换更快,因为如果强制转换失败,则不会抛出exception(这使得它适用于您合法地期望强制转换可能失败的情况)。
如果你只需要知道变量bar
是否为Foo
那么使用is
运算符, 但是如果你要测试bar
是否为Foo
,如果是, 则抛出它 ,然后你应该使用as
运算符。
基本上每个演员都需要在内部进行等同的检查,以确保演员表有效。 因此,如果你进行了一次检查,然后进行了完整的强制转换(使用as
cast,或使用经典的强制转换操作符),那么你实际上是在进行两次检查,这是一个额外的开销。
我学到它的方式是:
if (obj is Foo) { Foo f = (Foo)obj; f.doSomething(); }
比这慢:
Foo f = obj as Foo; if (f != null) { f.doSomething(); }
是否足够缓慢? 可能不是,但要注意这是一件很简单的事情,你不妨这样做。
“is”基本上等同于“isinst”IL运算符 – 该文章描述的速度很快。
它应该足够快,无所谓。 如果要检查对象的类型是否足以对性能产生显着影响,则需要重新考虑设计
上述就是C#学习教程:C#中’is’reflection的性能特征是什么?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/949624.html