CType と DirectCast  Visual Basic VB.NET入門

      2017/05/12


CType と DirectCastは式が一緒です。
指定した型から指定した型に変更するときに使います。
違いはなんでしょうか?
サンプルソースを使用してみていきましょう?

構文
CType
CType(変換元,変換後の型)

サンプルソース
Public Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim a As Object = 3.14
Dim b As Integer = CType(a, Integer)
MsgBox(b)
End Sub
End Class

実行結果

当たり前だけどObject型からInteger型は変換はできるけど
Integer型は整数型だから桁落ちするよ。

CType は式が間違っていなれば型変換してくれます。
CType は型を暗黙的に変換するということです。

構文
DirectCast
DirectCast(変換元,変換後の型)

サンプルソース
Public Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim a As Object = 3.14
Dim b As Integer = DirectCast(a, Integer)
MsgBox(b)
End Sub
End Class

実行結果
メッセージーボックスも表示されません。

どういうことでしょうか?
メッセージーボックスされないのでそれまで実行されていないということです。
DirectCastのエラーですよ。
DirectCastでは桁落ちする場合変換されないんですよ。

本当にそうなのか試してみましょう?

サンプルソース
Public Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim a As Object = 3
Dim b As Integer = DirectCast(a, Integer)
MsgBox(b)
End Sub
End Class

実行結果

桁落ちしないように3にデータを変えました。
DirectCastはしっかりさんですね。
じゃあCTypeいらないじゃん。
いえいえDirectCastは継承関係のないクラスや互換性がない型へのキャストできません。
この場合はObject型はなので継承されています。

DirectCastだと継承関係ないのでDoubleからIntegerに変換できません。
CTypeなら出来ますけど整数型に出来ます。
桁落ちするけど。
整数型にしてる時点で桁落ちしていいんでしょうが。
何のためにそもそもキャストするのかでしょうけど。

DirectCastの方が実行スピードが速いです。
公式から

DirectCast は Visual Basic のランタイム ヘルパー ルーチンを変換に使用しません。このため、オブジェクト型 (Object) との間で変換を行う場合に、CType よりもいくらかパフォーマンスがよくなります。

基礎文法をサンプルコードや文章で解説しています。

変数と型と演算子

インクリメント デクリメント

vb-net入門-三項演算子 IIf関数 If演算子

値型と参照型

構造体

IfとSelect Case条件文

For NextとFor Each条件文

Do While Loop条件文

イベント

イベントハンドラの追加と削除

デリケート

マルチキャストデリケート

ラムダ式

クラス

継承

隠蔽

ポリモーフィズム

抽象クラスと抽象メソッド

インターフェース

ジェネリック

LINQ

例外処理

配列

コレクション

サブルーチンとファンクション

PR



 - 基礎文法

Translate »