web-dev-qa-db-ja.com

DirectCastの代わりにTryCastを使用するのはなぜですか?

キャストしようとしているときObject objTと入力します。キャストできない場合は、問題があります。

そして、オブジェクトをキャストした後、キャストされたオブジェクトでの作業を探します。

むしろ、そのオブジェクトを使用する場所を言うよりも、キャストする場所で例外が発生することを期待しています。

この意味で、DirectCastの代わりにTryCastを使用する方が良いでしょうか?または、TryCastを使用する他の重要性が欠けていますか?

26
Biswanath

(C#開発者の場合、TryCastは "as"に似ており、DirectCastは通常のキャストに相当します。Mikeがコメントで指摘したように、 "as"はnull許容値型に対して機能しますが、TryCastはしません。)

値が本当にTである必要がある場合、DirectCastは確かに正しい方法です。適切なエラーが発生し、すぐに失敗します。

TryCastは、ターゲットが「間違った」タイプであることが正当な場合に適しています。たとえば、コンテナ内のすべてのButtonコントロールを取得するには、コントロールコレクションを実行し、tryでそれぞれをButtonにキャストします。それが機能する場合、あなたはそれを使って何かをします-それが機能しない場合、あなたは先に進みます。 (LINQを使用すると、この目的でOfTypeを使用できますが、私が何を意味するかがわかります...)

私の経験では、直接キャストはTryCastよりも適切であることが多いですが、ジェネリックでは、とにかく以前よりもキャストの頻度がはるかに少なくなっています。

39
Jon Skeet

2つの違いは、TryCastが失敗するとnullを返すのに対し、DirectCastは例外をスローすることだけです。

これらは、プログラムの処理方法に影響を及ぼします。個人的には、不適切なキャスト(ユーザー入力用のテキスト入力ボックスが数値タイプにキャストされるなど)の可能性が非常に高い場合は、例外をスローする必要がないことを好みます。

15
Jon Limjap

他の人は、「安全なキャスト」(例外のリスクを冒す前にキャストが成功できることを確認する)を実行する必要がある場合と実行しない場合について言及していると思います。プログラムで安全なキャストを実行する必要がある場合は、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

このパターンに従うことで、コストのかかる例外を処理する必要がなくなり、正しいタイプに効率的にキャストできます。

9
STW

オブジェクトが渡されることを設計で義務付けている場合[〜#〜] must [〜#〜]タイプTである場合は、キャストがデバッグビルドで成功することを(Debug.Assertのように)アサートし、徹底的な単体テストを実行して、実装が設計に従っていることを証明します。

設計が証明され、テストされているので、失敗することは決してないことを知っている直接キャストを実行できます。

1
Daniel Paull