私はVB.NETに入ったばかりの経験豊富なC / C ++ / C#プログラマーです。キャストにはCType(およびCInt、CBool、CStr)を使用します。これは、文字数が少なく、最初にキャストした方法でしたが、DirectCastとTryCastも知っています。
単純に、DirectCastとCTypeの間に違い(キャストの効果、パフォーマンスなど)はありますか?TryCastの考え方を理解しています。
私はVB.NETに入ったばかりの経験豊富なC / C ++ / C#プログラマーです。キャストにはCType(およびCInt、CBool、CStr)を使用します。これは、文字数が少なく、最初にキャストした方法でしたが、DirectCastとTryCastも知っています。
単純に、DirectCastとCTypeの間に違い(キャストの効果、パフォーマンスなど)はありますか?TryCastの考え方を理解しています。
回答:
最初に注意する点は、VB.NETにはC#の(type)instance
キャストメカニズムに直接類似したものがないことです。これは、2つのVB.NET演算子を比較する際の開始点として役立つためです(これらは演算子であり、関数のセマンティクスがあるにもかかわらず、関数ではありません)。
DirectCast()
C#キャスト演算子よりも厳密です。キャストするアイテムが既にキャスト先のタイプである場合にのみキャストできます。値の型のボックス化は解除されると思いますが、それ以外の場合は変換は行われません。したがって、たとえば、C#キャストの場合のようshort
にint
、からにキャストすることはできません(int)
。ただしIEnumerable
、基になるIEnumerable
オブジェクト変数が実際にである場合は、から配列にキャストできますArray
。そしてもちろんObject
、オブジェクトインスタンスのタイプが継承ツリー内のキャストタイプの下のどこかにあると想定して、何からでもキャストできます。
これはずっと速いので望ましいです。実行する必要がある変換と型チェックが少なくなります。
CType()
C#キャスト演算子ほど厳密ではありません。(int)
文字列を整数に変換するなど、単純なスタイルのキャストでは実行できないことを行います。これはConvert.To___()
、C#で呼び出すのと同じくらいの能力が___
あります。
これは非常に強力であるため、これは望ましいことです。ただし、この能力はパフォーマンスを犠牲にします。DirectCast()
キャストを完了するにはかなりの作業を行う必要があるため、C#のキャスト演算子ほど高速ではありません。一般的にはDirectCast()
、できる限り優先する必要があります。
最後に、TryCast()
C#のas
演算子に直接類似する1つのキャスト演算子を見逃しました。
DirectCast
は別の利点だと思います。間違えた場合、コンパイラーは即座に通知しますが、間違えた場合CType
、実行時に時折誤った動作を引き起こす可能性があります-おそらく、異なる地域設定のユーザーマシン上で。
DirectCast
、TryCast
、CType
/ Convert.ToXYZ()
、C<xyz>()
正しいでしょうか?
DirectCast
はクラスでは厳密であり、インターフェイスではありません(COM型(そしておそらく他の型.GetInterfaces
)でも、.NET型のリストで定義されていないインターフェイスを実際に実装できるため)。
TryCast()
とas
まったく同じではありません。TryCast()
参照型でのみ機能しますが、as
nullになる可能性があるものはすべて機能します。したがってint? icast = myNum as int?;
、問題なくDim icast as Integer? = TryCast(myNum, Integer?)
動作しますが、コンパイラエラーが発生します。2つの言語間のもう1つの独特な違い。笑
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