佐々木屋

技術的なことから趣味まで色々書きます

型変換は何を使う?(その①)

型を覚えるときに必ずセットで出てくる型変換(キャスト)の話です。

実は、型変換はC#VB.NETでだいぶ違います。C#は変換方法がだいたい決まっているのですが、VB.NETでは変換方法がありすぎて、プログラマーによってまちまちなのです。そのため初学者はどれを使っていいのか迷ってしまいます。

今回はどの型変換をどの場面で使えば良いのかを考えてみたいと思います。なお、先に言っておくと実は明確なルールというものは無く、あくまで私個人の見解となりますので、一つの意見としてとらえて下さい。

できそこないのDirectCast

いきなりのVBディスリですが、このDirectCastがこの問題の半分くらいを占めていると言って過言ではありません。C#でこれに対応するのが()による型変換ですが、挙動が全く異なります。違いは以下の通りです。

項目 C#
VB.NET
構文 (型) 値 DirectCast(値, 型)
適用範囲 ・値の型と変換する型が継承関係の場合
・ボクシング
・列挙型とその基となる型
●数値型同士
●列挙型と数値型
・値の型と変換する型が継承関係の場合
・ボクシング
・列挙型とその基となる型
速度 高速に処理されるがas演算子よりは低速 高速に処理される
適用範囲の●印の2つが重要で、例えばInteger型をDecimal型に変換するようなことはDirectCastでは出来ないのです。

//これは可能
int a = 0;
decimal b = (decimal)a;
'コンパイルエラー
Dim a As Integer
Dim b As Decimal = DirectCast(a, Decimal)

これはとても使いにくいです。処理自体はC#の()と同様で非常に高速で処理されますので多用したいのが山々ですが、結局こういった制約があるので使う場面は限られてしまいます。

型変換失敗時にNullを返す

C#はas演算子が相当しますが、VB.NETではTryCastがほぼ同じ挙動となります。エラー時はnullを返しますので、必然的に参照型だけ使用可能となります。

項目 C#
VB.NET
構文 値 as 型 TryCast(値, 型)
適用範囲 ・参照型
●null許容型
・参照型
なぜかVB.NETはnull許容型は適用外。

C#の場合は()よりasの方が高速に処理されますので、参照型であれば優先的に使用します。逆にVB.NETの場合はDirectCastの方が高速に処理されるので、はっきりってTryCastを利用する場面はあまりありません。

VB.NET独自の型変換関数

VB6でお馴染みCIntやCStrと同等処理となります。C#の()とほぼ同じ挙動(一部異なる)となりますが、速度は遅く、また数値型とString型が相互変換可能ということより、VB.NETだけの独自の仕組みと考えた方がよさそうです。

Dim a As Integer
Dim b As Decimal = CType(a, Decimal)
'以下も同等(内部的にCTypeが呼ばれる)
Dim c As Decimal = CDec(a)

VB独自関数といいつつ、前述したDirectCastが使えない場面では使わざるを得ないのが現状です。但し、値型の変換はこのあとに出てくるParse(TryParse)を利用した方がよいでしょう。