web-dev-qa-db-ja.com

DirectCast、CType、TryCastを使用したデータ型のキャスト

2005年のどこかでVB6からVB.NETに移動して以来、CTypeを使用して、あるデータ型から別のデータ型へのキャストを行ってきました。これは、VB6に存在していた入力が単純​​で、明らかに違いがない場合にDirectCastを使用する必要がある理由が分からないためです。

キャストが失敗することがあることを理解しているため、TryCastを時々使用します。ただし、CTypeとDirectCastの違いはわかりません。

誰も2つの違い(CTypeとDirectCast)を簡単な英語で違いを教えてもらえますか?何をどこで使用するかの例を追加することも役立ちます。

40
Alex Essilfie

TryCastとDirectCastは、CLRのキャストサポートに直接マップするキャスト演算子です。基本型のオブジェクトを派生型にすばやくキャストしたり、値型の値をボックス化解除したりできます。キャストが不可能な場合、DirectCastは例外をスローします。失敗した場合、TryCastはNothingを返します。通常、プログラミングの間違いを見つけるためにDirectCastを優先します。

CTypeは、CLRが眉をひそめる変換のスーパーセットを許可します。私が考えることができる最良の例は、文字列を数値または日付に変換することです。例えば:

Dim obj As Object
obj = "4/1/2010"
Dim dt As DateTime = CType(obj, DateTime)

Option Strict Onが有効な場合に使用する必要があります。オフの場合は、直接実行できます。

Option Strict Off
...
    Dim dt As DateTime = obj

もちろん非常に便利で、動的に型付けされた言語としてのVB.NETのレガシーの一部です。しかし、問題がないわけではありませんが、その日付はstackoverflow.comのユニコーンの日ですが、英国人が文字列を入力する1月の日です。予期しない変換が、CLRがこれらを直接許可しない理由です。明示的な、決して驚きのない変換は次のようになります。

Dim dt As DateTime = DateTime.Parse(obj.ToString(), _
    System.Globalization.CultureInfo.GetCultureInfo("en-US").DateTimeFormat)

Try/DirectCast vs CType vs明示的コンバージョンのどちらを購入すべきかは個人的な選択です。 Option Strict Onでプログラムする場合は、Try/DirectCastの使用を確実に開始する必要があります。動的な型指定の利便性が気に入っているためにVB.NET言語を好む場合は、CTypeにとどまることをためらわないでください。

53
Hans Passant

DirectCastは、値型(整数など)では2倍高速ですが、参照型では同じです。

詳細については、 this MSDNページの「変換関数、CType、DirectCast、およびSystem.Convert」セクションを参照してください。

16
Oded

これは page でよく説明されています。

それを読んで、DirectCastを使用すると、変換は絞り込みや展開(この場合は数値データ)なしで機能すると確信しています。一方、CTypeはそれに変換しようとしますが、開発者は縮小/拡張を認識しています。

1
shahkalpesh

「変換」とは、あるデータ型を別のデータ型に変換することを意味します(たとえば、文字列から整数、10進数から整数、オブジェクトから文字列など)。

「キャスト」とは、あるタイプのオブジェクトを、次のいずれかのルールによってそれに関連する別のタイプに変更することを意味します。

http://www.thedevheaven.com/2012/09/directcast-vs-ctype.html

0
Vikash Sinha