web-dev-qa-db-ja.com

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

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

単純に、DirectCastとCTypeの間に違い(キャストの影響、パフォーマンスなど)はありますか? TryCastのアイデアを理解しています。

96
Caleb Thompson

最初に注意することは、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()を見逃しました。

178
Joel Coehoorn

CTypeを使用すると、このCtype("string",Integer)のようなものを書くことができます。ただし、DirectCastを使用すると、上記のステートメントはコンパイル時エラーを引き起こします。

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

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
0
Hemantha