C# の「is」リフレクションのパフォーマンス特性は何ですか?[重複]

StackOverflow https://stackoverflow.com/questions/57701

  •  09-06-2019
  •  | 
  •  

質問

この質問にはすでに答えがあります:

その 示されている '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 2 回チェックするため、若干の余分なオーバーヘッドが生じます。

他のヒント

私がそれを学んだ方法は次のとおりです。

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