VB.NETのDirectCast()とCType()の違い


99

私はVB.NETに入ったばかりの経験豊富なC / C ++ / C#プログラマーです。キャストにはCType(およびCInt、CBool​​、CStr)を使用します。これは、文字数が少なく、最初にキャストした方法でしたが、DirectCastとTryCastも知っています。

単純に、DirectCastとCTypeの間に違い(キャストの効果、パフォーマンスなど)はありますか?TryCastの考え方を理解しています。


6
正確なこのの複製DirectCast、ctype関数、TryCastと鋳造のデータ型 stackoverflow.com/questions/2703585/...
MarkJ

回答:


182

最初に注意する点は、VB.NETにはC#の(type)instanceキャストメカニズムに直接類似したものがないことです。これは、2つのVB.NET演算子を比較する際の開始点として役立つためです(これらは演算子であり、関数のセマンティクスがあるにもかかわらず、関数ではありません)。

DirectCast()C#キャスト演算子よりも厳密です。キャストするアイテムが既にキャスト先のタイプである場合にのみキャストできます。値の型のボックス化は解除されると思いますが、それ以外の場合は変換は行われません。したがって、たとえば、C#キャストの場合のようshortint、からにキャストすることはできません(int)。ただしIEnumerable、基になるIEnumerableオブジェクト変数が実際にである場合は、から配列にキャストできますArray。そしてもちろんObject、オブジェクトインスタンスのタイプが継承ツリー内のキャストタイプの下のどこかにあると想定して、何からでもキャストできます。

これはずっと速いので望ましいです。実行する必要がある変換と型チェックが少なくなります。

CType()C#キャスト演算子ほど厳密ではありません。(int)文字列を整数に変換するなど、単純なスタイルのキャストでは実行できないことを行います。これはConvert.To___()、C#で呼び出すのと同じくらいの能力が___あります。

これは非常に強力であるため、これは望ましいことです。ただし、この能力はパフォーマンスを犠牲にします。DirectCast()キャストを完了するにはかなりの作業を行う必要があるため、C#のキャスト演算子ほど高速ではありません。一般的にはDirectCast()、できる限り優先する必要があります。

最後に、TryCast()C#のas演算子に直接類似する1つのキャスト演算子を見逃しました。


23
+1厳格さDirectCastは別の利点だと思います。間違えた場合、コンパイラーは即座に通知しますが、間違えた場合CType、実行時に時折誤った動作を引き起こす可能性があります-おそらく、異なる地域設定のユーザーマシン上で。
MarkJ 2010年

1
すばらしい答えです。だから、複雑さの順(大と小)に:DirectCastTryCastCType/ Convert.ToXYZ()C<xyz>()正しいでしょうか?
モットー

3
@モットー-閉じる。C <xyz>()の「関数」は、関数のセマンティクスがあるにもかかわらず、実際には関数ではなく演算子であるため、リストの上位に移動する必要があります。それらを持っているタイプの場合、それらはC#の(タイプ)キャスティングに非常に近いですが、少しだけ作業を行います。
Joel Coehoorn 2010

3
@MarkJ +1はコメントですが、メモDirectCastはクラスでは厳密であり、インターフェイスではありません(COM型(そしておそらく他の型.GetInterfaces)でも、.NET型のリストで定義されていないインターフェイスを実際に実装できるため)。
Mark Hurd

2
1 @JoelCoehoorn、しかし実際には、TryCast()asまったく同じではありません。TryCast()参照型でのみ機能しますが、asnullになる可能性があるものはすべて機能します。したがってint? icast = myNum as int?;、問題なくDim icast as Integer? = TryCast(myNum, Integer?)動作しますが、コンパイラエラーが発生します。2つの言語間のもう1つの独特な違い。笑
CptRobby 2014

12

ではCType次のようないくつかのことを書くことができますCtype("string",Integer)。しかしDirectCast、上記のステートメントを使用すると、コンパイル時にエラーが発生します。

 Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error
 Dim b As Integer = CType("1", Integer) 'Will compile

0

DirectCastはより制限的ですCType

たとえば、これはエラーをスローします。

Sub Main()
    Dim newint As Integer = DirectCast(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub

Visual Studio IDEにも表示されます。

ただし、これはエラーをスローしません。

Sub Main()
    Dim newint As Integer = CType(3345.34, Integer)
    Console.WriteLine(newint)
    Console.ReadLine()
End Sub
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.