Object obj
Typeにキャストしようとしているときに、キャストT
できない場合は何か問題があります。
そして、オブジェクトをキャストした後、キャスト オブジェクトの操作を探します。
むしろ、そのオブジェクトを使用する場所を言うよりも、キャストする場所で例外が発生することを期待しています。
そういう意味ではDirectCast
の代わりに使ったほうがいいのTryCast
でしょうか?または、を使用することの他の重要性を見逃していTryCast
ますか?
(C# 開発者にとってTryCast
は、「as」に似ておりDirectCast
、通常のキャストと同等です。Mike がコメントで指摘したように、「as」は null 許容値型では機能しますが、TryCast
機能しません。)
値が本当に である必要がある場合T
は、DirectCast
実際に正しい方法です。適切なエラーですばやく失敗します。
TryCast
ターゲットが「間違った」タイプであることが正当な場合に適しています。たとえば、コンテナー内のすべての Button コントロールを取得するには、コントロール コレクションを調べて、それぞれを Button にキャストしてみます。それが機能する場合は、それを使って何かを行います。機能しない場合は、先に進みます。(LINQを使用するOfType
と、この目的に使用できますが、私の言いたいことがわかります...)
私の経験では、ダイレクト キャストはより頻繁に適切TryCast
です。
2 つの唯一の違いは、aTryCast
は失敗した場合に null を返し、a はDirectCast
例外をスローすることです。
これらは、プログラムの処理方法に影響を与えます。個人的には、不適切なキャスト (ユーザー入力のテキスト入力ボックスが数値型にキャストされるなど) の可能性が非常に高い場合は、例外をスローする必要がないことを好みます。
他の人は、「安全なキャスト」(例外の危険を冒す前にキャストが成功することを確認する) を実行する必要がある場合と実行しない場合について言及していると思います。プログラムが安全なキャストを実行する必要がある場合、このTryCast
メソッドはユーザーとプログラムの両方の作業を節約します。
私は今日までその機能に気づいていませんでしたTryCast()
。安全にキャストする「悪い」方法を使用するのはばかげているように感じます。
関数について知らなかった場合、次のTryCast()
ような結果になる可能性があります。
'' wasteful, the TypeOf and DirectCast calls are redundant
If TypeOf obj Is SomeClass Then
someObj = DirectCast(obj, SomeClass)
'' More code
End If
問題は、このメソッドが実際に 2 つのキャストを実行することです (技術的には、実際には型チェックだと思います)。を使用しTryCast
て結果が Nothing かどうかを確認すると、2 番目のキャストが不要になり、不要な作業が省けます。
'' efficient, only one cast is ever performed and there are no InvalidCastExceptions thrown
someObj = TryCast(obj, SomeClass)
If someObj IsNot Nothing Then
'' More code
End If
このパターンに従うことで、高価な例外を処理する必要がなくなり、正しい型に効率的にキャストできます。
渡されるオブジェクトがT 型でなければならないことが設計で義務付けられている場合は、(Debug.Assert のように) キャストがデバッグ ビルドで成功することをアサートし、徹底的な単体テストを実行して、実装が設計に従っていることを証明します。
設計が証明され、テストされたので、決して失敗しないことがわかっているので、ダイレクト キャストを実行できます。