2008-09-11 12 views
18

これはshownです。キャストはプレフィックスキャストよりもはるかに高速ですが、 '反射'はどうですか?どれくらい悪い?あなたが想像しているように、Googleで 'is'を検索することは非常に効果的ではありません。C#での 'is' reflectionのパフォーマンス特性は何ですか?

+2

'は非常に高速です。 –

+0

私は、日付が重複した質問を閉じる際の唯一の決定要因ではないことを認識していますが、私の質問は他の質問が投稿される前に投稿され、回答されupvotedされました。 _It_は重複したものであり、このものではありません。 –

答えて

19

いくつかのオプションがあります:

  1. 古典的なキャストFoo foo = (Foo)bar
  2. asキャスト演算子Foo foo = bar as Foo
  3. isテストbool is = bar is Foo
は、
  1. barが安全(クイック)Fooにキャストした後、実際に(遅い)、それを行うか、(本当に遅い)例外をスローすることが可能かどうかを確認する必要があります古典的なキャスト。
  2. barをキャストできるかどうかを確認する必要がありますasオペレータは、その後、キャストを行う、またはそれが安全にキャストできない場合、それはちょうどnullを返します。
  3. isオペレータは、barがFooにキャストできるかどうかを確認して、booleanを返します。それが唯一のフル鋳造作業の最初の部分を行いますので、

isテストは、迅速です。 as演算子は、キャストが失敗した場合に例外をスローしないため、従来のキャストよりも高速です(キャストに失敗すると正当に想定される状況に適しています)。

あなただけの変数barあなたはbarFooであるかどうかをテストするつもりならFooは、その後、isオペレータ、しかしを使用しているかどうかを知る必要がある場合は、そうであれば、はそれをキャストの場合は、asの演算子を使用してください。

本質的に、キャストが有効であることを保証するために、すべてのキャストは最初に内部でisのチェックと同等の処理を行う必要があります。したがって、isチェックの後に完全キャスト(asキャスト、または古典的キャスト演算子のいずれか)を行うと、isチェックが2回行われますが、これは若干のオーバーヘッドです。

+3

チェックは最も遅いですが、参照型を返すだけなので、参照型でのキャストは非常に高速です。 –

+0

この1つの答えは、私が考えを得るのを助けました.. – nawfal

6

"isinst" IL演算子と基本的に同じです。

3

これは問題ではないほど速くなければなりません。

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

これより遅いです:あなたは十分なオブジェクトの型をチェックしている場合、それはあなたがあなたのデザイン

7

私は、これはということです学んだ方法を再考する必要があり、パフォーマンスに顕著な影響を作るために

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

遅くても問題ありませんか?おそらくそうではありませんが、注意を払うのはとても簡単なことです。

関連する問題