「as」キャストはプレフィックス キャストよりもはるかに高速であることが示されていますが、「is」リフレクションはどうでしょうか。どれくらい悪い?ご想像のとおり、Google で「is」を検索してもあまり効果的ではありません。
4 に答える
いくつかのオプションがあります:
- クラシックキャスト:
Foo foo = (Foo)bar
as
キャスト演算子:Foo foo = bar as Foo
is
テスト: _bool is = bar is Foo
- 従来のキャストでは、
bar
安全にキャストできるかどうかFoo
(迅速) を確認してから、実際にキャストする (遅い) か、例外をスローする (非常に遅い) 必要があります。 as
オペレーターは、bar
キャストできるかどうかを確認してからキャストする必要があります。安全にキャストできない場合は、単に を返しますnull
。is
演算子はbar
、 を Foo にキャストできるかどうかをチェックし、 を返しますboolean
。
is
テストは、完全なキャスト操作の最初の部分のみを行うため、迅速です。オペレーターは、as
キャストが失敗した場合に例外をスローしないため、従来のキャストよりも高速です (これは、キャストが失敗する可能性があると正当に予想される状況に適しています)。
bar
変数が a であるかどうかを知る必要がある場合は、演算子BUTFoo
を使用します。 が a であるかどうかをテストする場合は、それをキャストします。演算子を使用する必要があります。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 演算子と同等です。この記事では、これが高速であると説明しています。
問題にならないほど速いはずです。パフォーマンスに顕著な影響を与えるのに十分なオブジェクトのタイプをチェックしている場合は、設計を再考する必要があります