キャストしようとしているときObject obj
をT
と入力します。キャストできない場合は、問題があります。
そして、オブジェクトをキャストした後、キャストされたオブジェクトでの作業を探します。
むしろ、そのオブジェクトを使用する場所を言うよりも、キャストする場所で例外が発生することを期待しています。
この意味で、DirectCast
の代わりにTryCast
を使用する方が良いでしょうか?または、TryCast
を使用する他の重要性が欠けていますか?
(C#開発者の場合、TryCast
は "as"に似ており、DirectCast
は通常のキャストに相当します。Mikeがコメントで指摘したように、 "as"はnull許容値型に対して機能しますが、TryCast
はしません。)
値が本当にT
である必要がある場合、DirectCast
は確かに正しい方法です。適切なエラーが発生し、すぐに失敗します。
TryCast
は、ターゲットが「間違った」タイプであることが正当な場合に適しています。たとえば、コンテナ内のすべてのButtonコントロールを取得するには、コントロールコレクションを実行し、tryでそれぞれをButtonにキャストします。それが機能する場合、あなたはそれを使って何かをします-それが機能しない場合、あなたは先に進みます。 (LINQを使用すると、この目的でOfType
を使用できますが、私が何を意味するかがわかります...)
私の経験では、直接キャストはTryCast
よりも適切であることが多いですが、ジェネリックでは、とにかく以前よりもキャストの頻度がはるかに少なくなっています。
2つの違いは、TryCast
が失敗するとnullを返すのに対し、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
このパターンに従うことで、コストのかかる例外を処理する必要がなくなり、正しいタイプに効率的にキャストできます。
オブジェクトが渡されることを設計で義務付けている場合[〜#〜] must [〜#〜]タイプTである場合は、キャストがデバッグビルドで成功することを(Debug.Assertのように)アサートし、徹底的な単体テストを実行して、実装が設計に従っていることを証明します。
設計が証明され、テストされているので、失敗することは決してないことを知っている直接キャストを実行できます。