明示的なキャストの実行と as/is 構文の使用の違いは何ですか?
// explicit casting
var castedObj = (ICar)originalObj;
// 'as' casting
var obj2 = originalObj as ICar;
私の仮定は、明示的なキャストの使用が最適化されている一方で、msil コードの作成中に as/is を使用すると、パフォーマンスに影響するランタイム チェックが必要になるということです。
私は正しいですか?
パフォーマンスは、選択とは関係ありません。
であることがわかっている場合ICar
は、キャストを使用します。
わからない場合は、"as" を使用して、null の結果をテストします。
あなたの意図を表現するものを使用してください。
キャストには実行時チェックも必要なので、違いはほとんどありません。
はas
nullまたはキャストされたオブジェクトを返すため、参照を割り当てるというわずかな余分なオーバーヘッドが発生する可能性があります[編集:しかし、そうではないようです; 以下のリンク先のブログを参照してください]
(コンパイラがコンパイル時に型を知っている場合、キャストアウェイを最適化しますが、as
アウェイも最適化します。また、キャストが失敗した場合、実際には非常に遅い例外が生成されますが、期待する場合は重要ではありませんキャストは常に成功します。)
技術的には、キャストの場合、生成される IL は次のようになります ( へのキャストの例object
) string
:
castclass string
および の場合as
:
isinst string
誰かがいくつかの詳細なタイミングを行った次のブログ投稿を参照してください (そして、それisinst
がわずかに高速であることがわかりましたが、気にするほどではありません)。
http://m3mia.blogspot.co.uk/2007/11/comparing-isinst-to-castclass.html
これをプロファイリングして、自分の目で確かめてみませんか?
ただし、考慮すべき重要なことは、最初のインスタンスで ICar でない場合、例外がスローされることです。それを try/catch ブロックでラップして例外を処理することもできますが、originalobj が ICar でない場合は obj2 に null を割り当てる「as」キーワードを使用する方が速い可能性が高く、依存するのではなく単に null チェックを行うことができます。より計算コストの高い例外処理について。
ただし、今日のマシンでは、パフォーマンスの違いはごくわずかです。