私は経験豊富なC/C++/C#プログラマであり、VB.NETを使い始めたばかりです。通常、キャストにはCType(およびCInt、CBool、CStr)を使用します。これは文字数が少なく、最初にキャストする方法であったためですが、DirectCastとTryCastも認識しています。
単純に、DirectCastとCTypeの間に違い(キャストの影響、パフォーマンスなど)はありますか? TryCastのアイデアを理解しています。
最初に注意することは、VB.NETにはC#の_(type)instance
_キャストメカニズムに直接類似していないことです。 2つのVB.NET演算子を比較する際の出発点としてそれを使用すると便利であるため、これを取り上げます(関数セマンティクスはありますが、関数ではなく演算子です)。
DirectCast()
は、C#キャスト演算子よりも厳密です。キャストするアイテムが既にあるキャスト先のタイプの場合にのみキャストできます。変換は行われません。したがって、たとえば、C#_(int)
_キャストのように、shortからintにキャストすることはできません。ただし、基になるIEnumerable
オブジェクト変数が実際にArray
である場合、IEnumerableから配列にキャストできます。そしてもちろん、オブジェクトインスタンスを実際に継承ツリーのキャストタイプの下にあると仮定すると、Objectから任意のものにキャストできます。
fasterになるため、これが望ましいです。実行する必要がある変換と型チェックが少し少なくなります。
CType()
は、C#キャスト演算子よりも厳密ではありません。単純な_(int)
_キャストで実行できない文字列を整数に変換するなどの処理を行います。 C#でConvert.To___()
を呼び出すのと同じくらい強力です。ここで、___はキャストのターゲットタイプです。これは非常に強力なので望ましいですが、そのパワーはパフォーマンスを犠牲にします。DirectCast()やC#のキャスト演算子ほど高速ではありません。
一般に、可能であればDirectCast()
を好むはずです。
最後に、C#のas
演算子に直接類似する1つのキャスト演算子TryCast()
を見逃しました。
CType
を使用すると、このCtype("string",Integer)
のようなものを書くことができます。ただし、DirectCast
を使用すると、上記のステートメントはコンパイル時エラーを引き起こします。
Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error
Dim b As Integer = CType("1", Integer) 'Will compile
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