26

Object objTypeにキャストしようとしているときに、キャストTできない場合は何か問題があります。

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

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

そういう意味ではDirectCastの代わりに使ったほうがいいのTryCastでしょうか?または、を使用することの他の重要性を見逃していTryCastますか?

4

4 に答える 4

39

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

値が本当に である必要がある場合Tは、DirectCast実際に正しい方法です。適切なエラーですばやく失敗します。

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

私の経験では、ダイレクト キャストはより頻繁に適切TryCastです。

于 2008-12-22T07:32:53.370 に答える
15

2 つの唯一の違いは、aTryCastは失敗した場合に null を返し、a はDirectCast例外をスローすることです。

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

于 2008-12-22T07:33:03.870 に答える
9

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

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

于 2009-01-30T21:37:04.393 に答える
1

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

設計が証明され、テストされたので、決して失敗しないことがわかっているので、ダイレクト キャストを実行できます。

于 2008-12-22T08:13:01.027 に答える