Visual Basicでは、列挙型(Enum)は名前付き整数定数を宣言するために使用され、コードの可読性やメンテナンス性を高めます。列挙型は次のように宣言されます:
Public Enum StatusCode Success = 0 Warning = 1 Error = 2 End Enum
重要な注意点:
使用例:
Dim code As StatusCode = StatusCode.Success If code = StatusCode.Error Then Console.WriteLine("エラー!") End If ' 存在しない値の割り当て code = CType(5, StatusCode) ' これはコンパイルされますが、値はEnumに定義されていません
Enum型の変数に、Enumに列挙されていない値を割り当てることはできますか?それはどのような結果をもたらす可能性がありますか?
はい、Visual Basic(および.NET全体)では、Enum型の変数に適切な(基本型に基づく)数値を明示的な変換(
CType、DirectCast)を介して割り当てることができます。これはコンパイルエラーを引き起こしませんが、その後の使用時に潜在的な問題を引き起こします。なぜなら、そのような値はEnumの要素名として表示されず、ToStringメソッドを介して正しく解析することができないからです。例えば:
Dim code As StatusCode = CType(42, StatusCode) Console.WriteLine(code) ' '42'を出力し、Enumの要素名ではありません
物語
ある大規模なプロジェクトでは、開発者がWebAPIを介してステータスをintとして伝え、クライアント側でEnumに変換していました。Enumに追加されていない新しい値が出現すると、アプリケーションは正しい情報を表示しませんでした。なぜなら、Enumの「有効性」をチェックする機能が欠けていたからです。
物語
Option StrictなしでのEnumの使用は、外部ソースから受信したランダムな数値が暗黙的にEnumに変換され、ランタイムで追跡が困難なビジネスロジックのバグを引き起こしました。
物語
Enumの基底型(例えば、メモリ節約のためのByte)を明示的に指定しなかったため、Compact Framework上の狭いマイクロコントローラーソリューションで整数型の予期しないオーバーフローにつながりました。