Programmingアプリケーション開発者 (VB.NET)

Visual BasicでEnumの値を処理し、繰り返す方法はどうなっていますか?無効な値をEnum変数に割り当てる際のエラーを回避する方法はありますか?

Hintsage AIアシスタントで面接を突破

回答。

問題の歴史

Visual Basicの列挙型(Enum)は、コードの可読性と信頼性を向上させるために使用されます。Enumは名前付き定数のセットを定義でき、プログラムのロジックに対して厳密な許可された値のセットを作成します。

問題

多くの人は、Enumが変数の値を列挙されたメンバーの1つに完全に制限すると考えています。しかし実際には、Enum変数は整数型の値を保持しており、基本型の許可された任意の値を割り当てることが可能で、これがエラーや予期しない動作を引き起こす可能性があります。

解決策

VB.NETでは、Enum変数にリストに定義されていない値を割り当てることは許可されています。安全に値を反復処理するためには、System.Enum.GetValues関数を使用します。値の妥当性の確認は追加のチェックによって行われます。

コード例:

Enum Colors Red = 1 Green = 2 Blue = 3 End Enum Dim c As Colors = CType(4, Colors) ' これはコンパイルエラーにはなりません! For Each value As Colors In [Enum].GetValues(GetType(Colors)) Console.WriteLine(value) Next ' チェック If [Enum].IsDefined(GetType(Colors), c) Then Console.WriteLine("OK") Else Console.WriteLine("無効な値です!") End If

主な特徴:

  • Enumは本質的に名前付きの整数定数です
  • Enum変数には基本型の任意の値を割り当てることができます
  • 保護はロジックとIsDefinedのチェックに委ねられます

ひねりのある質問。

Enum変数が常に宣言された値のみを含むことを保証できますか?

いいえ。言語のレベルでは、Enumは基本的な数値型の簡易ラッパーです。特定の値の有効性の確認は、常にIsDefinedを介して明示的に行う必要があります。

宣言されていない値のEnumからその値の文字列表現を得ることは可能ですか?

はい。存在しない値が割り当てられたEnumに対するToStringメソッドは、その数値の等価物を文字列として返します。たとえば、Colors = 4の場合、結果は"4"になります。

Enum.GetValuesを通じてすべての値を列挙し、その後Enum変数に列挙外の数値を割り当てるとどうなりますか?

GetValuesの繰り返しは、宣言されたメンバーのみを返しますが、Enum変数は依然として範囲外の任意の数値を保持でき、これは文法的なエラーではなく論理エラーになります。

典型的なエラーとアンチパターン

  • Enumを使用する前にEnum.IsDefinedを確認しない
  • 数値をEnumに盲目的に変換する
  • 明示的な合計値の処理なしにビットフラグを使用する

実生活の例

ネガティブケース

画面からの入力が検証なしにEnumに直接変換され、無効な値を取得し、アプリケーションが後の段階でクラッシュします。

利点:

  • 速い

欠点:

  • ビジネスロジックのクラッシュ、診断の難しさ

ポジティブケース

ユーザーの値はまずEnum.IsDefinedを通して検証され、無効なデータに対しても処理が正しいです。

利点:

  • 信頼性、予測可能な動作

欠点:

  • 検証用に追加のコード行が必要です。