41

2005年にVB6からVB.NETに移行して以来、CTypeを使用して1つのデータ型から別のデータ型へのキャストを行ってきました。これを行うのは、入力が簡単で、VB6に存在していたためです。明らかに違いがないのに、なぜDirectCastを使用する必要があるのか​​わかりません。

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

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

4

4 に答える 4

56

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とCTypeと明示的な変換のどちらを購入するかは、個人的な選択です。Option Strict Onを使用してプログラミングする場合は、必ずTry/DirectCastの使用を開始する必要があります。動的型付けの便利さが好きなためにVB.NET言語を好む場合は、CTypeを使用することを躊躇しないでください。

于 2010-04-24T15:07:23.780 に答える
16

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

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

于 2010-04-24T07:23:58.960 に答える
1

このページはそれをよく説明しています。

それを読んで、あなたが使うときDirectCast、あなたは変換が狭めたり広げたりすることなく(この場合は数値データ)うまくいくと確信していると思います。一方、CType開発者はナローイング/エクスパンションを認識して、それに変換しようとします。

于 2010-04-24T15:15:50.333 に答える
0

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

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

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

于 2012-09-28T04:35:46.267 に答える