Visual Basicでは、型の変換には明示的と暗黙的があります:
CInt(), CDbl(), CStr(), DirectCast, TryCast などの演算子を使って行われます。信頼性を確保するには、以下を推奨します:
Option Strict Onを使用する — これにより、暗黙の変換が禁止され、明示的な変換が要求され、実行時エラーを防ぎます。例:
Option Strict On Dim a As Integer Dim b As Double = 4.5 'a = b ' コンパイルエラー! a = CInt(b) ' 正常:小数部分が失われる可能性のある明示的な変換 '文字列の変換 Dim s As String = "123" Dim n As Integer = Integer.Parse(s)
Val()関数を使用して文字列を数値に変換することに関連するリスクは何であり、なぜそれがしばしば推奨されないのでしょうか?
回答:
Val()は、最初の非数値文字までの数値部分だけを変換します。文字や特殊文字で始まる文字列の場合、0を返します。これは、全体の値の変換が期待される場合にエラーを隠す可能性があります。
例:
Dim value1 = Val("123abc") ' 123を返す Dim value2 = Val("abc123") ' 0を返す! ' より良い方法: Integer.TryParse("abc123", val)
物語
ERPシステムでは、データベースから値を読み取った際に、暗黙の文字列からIntegerへの変換がチェックなしで行われ、不正なデータによって例外が発生しました。それが原因で、レポートモジュール全体の作業が停止しました。
物語
旧式のシステムとの統合の際に、プログラマーは文字列の変換にValを使用しましたが、文字で始まる部分文字列(例えば、「A1234」)がありました。その結果、0として誤って解釈されたIDが失われ、顧客のロイヤリティプログラムに障害が発生しました。
物語
開発者は、オブジェクトの型互換性を確認せずにDirectCastを使用しました。予期しない型のオブジェクトが到着すると、InvalidCastExceptionがスローされ、データ処理のチェーンが壊れました。