1

明示的なキャストの実行と as/is 構文の使用の違いは何ですか?

// explicit casting
var castedObj = (ICar)originalObj;

// 'as' casting
var obj2 = originalObj as ICar;

私の仮定は、明示的なキャストの使用が最適化されている一方で、msil コードの作成中に as/is を使用すると、パフォーマンスに影響するランタイム チェックが必要になるということです。

私は正しいですか?

4

3 に答える 3

3

パフォーマンスは、選択とは関係ありません。

  • であることがわかっている場合ICarは、キャストを使用します。

  • わからない場合は、"as" を使用して、null の結果をテストします。

あなたの意図を表現するものを使用してください。

于 2013-03-03T12:51:25.620 に答える
1

キャストには実行時チェックも必要なので、違いはほとんどありません。

asnullまたはキャストされたオブジェクトを返すため、参照を割り当てるというわずかな余分なオーバーヘッドが発生する可能性があります[編集:しかし、そうではないようです; 以下のリンク先のブログを参照してください]

(コンパイラがコンパイル時に型を知っている場合、キャストアウェイを最適化しますが、asアウェイも最適化します。また、キャストが失敗した場合、実際には非常に遅い例外が生成されますが、期待する場合は重要ではありませんキャストは常に成功します。)

技術的には、キャストの場合、生成される IL は次のようになります ( へのキャストの例object) string:

castclass string

および の場合as:

isinst string

誰かがいくつかの詳細なタイミングを行った次のブログ投稿を参照してください (そして、それisinstがわずかに高速であることがわかりましたが、気にするほどではありません)。

http://m3mia.blogspot.co.uk/2007/11/comparing-isinst-to-castclass.html

于 2013-03-03T12:46:32.270 に答える
1

これをプロファイリングして、自分の目で確かめてみませんか?

ただし、考慮すべき重要なことは、最初のインスタンスで ICar でない場合、例外がスローされることです。それを try/catch ブロックでラップして例外を処理することもできますが、originalobj が ICar でない場合は obj2 に null を割り当てる「as」キーワードを使用する方が速い可能性が高く、依存するのではなく単に null チェックを行うことができます。より計算コストの高い例外処理について。

ただし、今日のマシンでは、パフォーマンスの違いはごくわずかです。

于 2013-03-03T12:48:48.563 に答える