21

「as」キャストはプレフィックス キャストよりもはるかに高速であることが示されていますが、「is」リフレクションはどうでしょうか。どれくらい悪い?ご想像のとおり、Google で「is」を検索してもあまり効果的ではありません。

4

4 に答える 4

20

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

  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変数が a であるかどうかを知る必要がある場合は、演算子BUTFooを使用します。 が a であるかどうかをテストする場合は、それをキャストします。演算子を使用する必要があります。isbarFooas

is基本的に、すべてのキャストは、キャストが有効であることを確認するために、最初に内部でチェックに相当することを行う必要があります。そのため、isチェックの後にフル キャスト (asキャスト、または従来のキャスト オペレーターを使用) を実行すると、事実上、isチェックを 2 回実行することになります。これは、わずかに余分なオーバーヘッドです。

于 2008-09-11T22:39:58.000 に答える
8

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

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

これより遅い:

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

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

于 2008-09-11T21:32:05.323 に答える
6

「is」は基本的に「isinst」IL 演算子と同等です。この記事では、これが高速であると説明しています。

于 2008-09-11T21:27:50.263 に答える
2

問題にならないほど速いはずです。パフォーマンスに顕著な影響を与えるのに十分なオブジェクトのタイプをチェックしている場合は、設計を再考する必要があります

于 2008-09-11T21:28:23.773 に答える