Visual Basic.NETでの型キャスト

Molly Pell,Senior Systems Analyst

Visual Basic.NETには、キャストするための二つのオプションがあります。

  • CType:ある型を別の型にキャストまたは変換します。 型が一致しない場合は、強制が実行される可能性があります。
  • DirectCast:ある型をCTypeよりも優れたパフォーマンスで別の型にキャストしますが、型が一致しない場合は強制を実行しません。

注:CTypeにはすべてのVB変換関数が含まれています。 これらは、CBool、CByte、CChar、CDate、CDec、CDbl、CInt、CLng、CObj、CShort、CSng、およびCStrです。

両者の主な違いは、DirectCastは、指定された型と式の実行時型が同じ場合にのみ機能することです。 この違いは、オブジェクト型から値型に変換するとき、または値のボックス化を解除するときにのみ表示されます。

たとえば、オブジェクトOのボックス化された型が整数ではないため、次のDirectCast操作は失敗します:

Dim O As Object=1.5

Dim I As Integer=DirectCast(O,Integer)’実行時エラーが発生します。

Dim I As Integer=CType(O,Integer)’は実行時エラーを引き起こしません。

一方、この例のDirectCast操作は成功します:

Dim O As Object=1

Dim I As Integer=DirectCast(O,Integer)’は成功します。

Dim I As Integer=CType(O,Integer)’は成功しますが、DirectCastよりも低速です

オブジェクトから値型への変換、またはボックス化解除時に、DirectCast演算子のパフォーマンスはCType演算子 Visual Basicです。NET compilerはDirectCast用の4行のILコードを生成します。 ただし、CTypeを使用すると、Visual Basic.NETコンパイラは、ILコードの百行をはるかに超える変換メソッドへの呼び出しを生成します。 このメソッドは、他のメソッドを呼び出します。 パフォーマンスが重要なコードでは、その違いは大きくなる可能性があります。 ただし、強制変換が必要な場合は、CType操作を使用するか、手動で強制変換を実行する必要があります。

:

オブジェクトとしてのDim O=1。5

Dim f As Single=DirectCast(O,Single)’ランタイムタイプにキャスト

Dim i As Integer=CType(f,Integer)’CTypeはここでOKです。
‘キャストはボックスを解除しません’f’

結論

型をオブジェクト型から値型にキャストしたり、ボックス化を解除したりするときは、まず型強制が必要かどうかを判断する必要があります。 強制変換が必要ない場合(つまり、値のボックス化された型がcast式で指定された型と同じ場合)、DirectCast式を使用してアプリケーションのパフォーマンスを向上さ

このヒントとより多くの合計.NETアナライザであなたのために検出されました! 詳細については、”FMS.NET Analyzer”を参照してください。