当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C#中'is'反射的性能特征是什么?》经验,为你挑选了3个好方法。

它表明 'as'铸造比前缀铸造快得多,但是'是'反射怎么样?有多糟糕?可以想象,在Google上搜索"is"并不是非常有效.



1> Daniel Fortu..:

有几个选择:

    经典的投:Foo foo = (Foo)bar

    as类型转换操作符:Foo foo = bar as Foo

    is测试:bool is = bar is Foo


    经典的铸造需要检查是否bar可以安全地转换为Foo(快速),然后真正做到这一点(慢),或抛出一个异常(很慢).

    as操作需要检查是否bar可以转换,然后做演员,或者如果它不能安全地转换,那么它只是返回null.

    is运营商只检查是否bar可以转换为富,并返回boolean.

is测试是快,因为它只做一个完整的铸造过程中的第一部分.该as运营商比传统铸铁更快,因为如果转换失败时不引发异常(这使得它适合在那里你合理地期望,中投可能会失败的情况下).

如果您只需要知道变量bar是否为a Foo然后使用is运算符,但是,如果您要测试是否bar为a Foo,如果是,则转换它,然后您应该使用as运算符.

基本上每个演员都需要在is内部进行相当于一次检查,以确保演员表有效.因此,如果你进行is检查,然后进行完整演员(无论是as演员,还是使用经典演员),你实际上都会进行is两次检查,这是一个额外的开销.


检查是最慢的,转换在引用类型上非常快,因为它只返回引用.

2> swilliams..:

我学到它的方式是:

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

比这慢:

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

是否足够慢到重要?可能不是,但要注意这是一件很简单的事情,你也可以这样做.



3> Curt Hagenlo..:

"is"基本上等同于"isinst"IL运算符 - 该文章描述的速度很快.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有