2011-06-19 9 views
10

可能性の重複としてOBJ対:私はC#でのキャストの2種類の方法を見てきました
casting vs using the 'as' keyword in the CLRC#の異なる方法 - (T)は、obj T

。例えば

MyObj foo = (MyObj) bar; // this is what I see most of the times 
MyObj foo = bar as MyObj; // I do see this sometimes 
  • だから、基本的な違いは何ですか?
  • style 1style 2キャスティングの固有の名前は何ですか?
  • 何を使用するかはどのように決定するのですか?
  • パフォーマンスに大きな問題はありますか?
  • このトピックに関連するその他の情報はありますか?

キャストが無効である場合は、このに探してくれてありがとうたくさん:)

答えて

24

最初の1(「直接」または「C-スタイル」のキャスト)は、例外がスローされます。これは、オブジェクトに対して実際の型変換を実行する唯一の方法です。 (型変換はキャストとは異なりますが、キャストは変数の型を変更するだけで、型変換は*異なる型のオブジェクトを与えます)

2番目のものはありませんVB.NETで呼び出されるように「試してみてください」と呼びます)nullの代わりにを投げてInvalidCastExceptionと評価します。 (この動作のため、参照型に対してのみ機能します)。

お互いに比較して大きなパフォーマンス上の問題はありません。

asを使用するのは、となる場合のみ、結果が有効でない可能性があります。それ以外の場合は、最初のものを使用します。ところで


、あなたの質問の一部についてMSDN might be helpful

asオペレータは、キャスト演算のようなものです。ただし、変換が不可能な場合は、例外を発生させる代わりにnullを返します。次の式を考慮してください。

expression as type 

式が1回だけ評価される点を除いて、次の式に相当します。

expression is type ? (type)expression : (type)null 

asオペレータは参考変換とボクシングの変換を行うことに留意されたいです。 as演算子は、ユーザー定義の変換などの他の変換は実行できません。変換はキャスト式を使用して実行する必要があります。

+1

キャストは含まれず、キャストと同じ構文を使用する型変換演算子については言及していませんでした。 –

+1

@Merlyn:それでは、ありがとうございます。 :) @pst:クリーンアップありがとう! – Mehrdad

+1

'foo = bar as SomeType;は' if(bar is SomeType){foo =(SomeType)} barよりも高速です。 } '、型は一度だけチェックされるためです。そして、try {foo =(SomeType)bar}よりもはるかに高速です。 } catch(InvalidCastException){} '変換が失敗した場合、例外は非常に高価です。 – Sven

関連する問題