質問
VB.netで列挙型を結合する方法はありますか?
解決
あなたが欲しいのはフラグ型の列挙型だと思います。
Flags 属性を列挙型の先頭に追加する必要があります。そうすれば、列挙型を「Or」キーワードと組み合わせることができます。
このような:
<Flags()> _
Enum CombinationEnums As Integer
HasButton = 1
TitleBar = 2
ReadOnly = 4
ETC = 8
End Enum
注記: 右側の数値は常に 2 倍 (2 の累乗) になります。これは、設定されている個々のフラグを分離できるようにするために必要です。
Or キーワードを使用して、必要なフラグを組み合わせます。
Dim settings As CombinationEnums
settings = CombinationEnums.TitleBar Or CombinationEnums.Readonly
これにより、TitleBar と Readonly が enum に設定されます
設定内容を確認するには:
If (settings And CombinationEnums.TitleBar) = CombinationEnums.TitleBar Then
Window.TitleBar = True
End If
他のヒント
FlagsAttribute を使用して次のように Enum を装飾することができ、これにより Enum を結合できるようになります。
<FlagsAttribute> _
Public Enumeration SecurityRights
None = 0
Read = 1
Write = 2
Execute = 4
そして、次のように呼び出します (UserPriviltes クラス)。
Public Sub New ( _
options As SecurityRights _
)
New UserPrivileges(SecurityRights.Read OR SecurityRights.Execute)
これらは効果的に結合され (ビット演算)、上記のユーザーは読み取りと実行の両方を 1 つの派手な SecurityRights 変数で実行できるようになります。
ユーザーに権限があるかどうかを確認するには、AND (よりビット単位の計算) を使用して、ユーザーの列挙値とチェックしている列挙値を確認します。
//Check to see if user has Write rights
If (user.Privileges And SecurityRights.Write = SecurityRigths.Write) Then
//Do something clever...
Else
//Tell user he can't write.
End If
HTH、タイラー
あなたの質問を正しく理解できれば、異なる列挙型を組み合わせたいということになります。つまり、1 つの変数には 2 つの異なる enum のいずれかの値を格納できますよね?1 つの列挙型の 2 つの異なる値を組み合わせて保存することについて質問している場合は、Dave Arkell の説明を参照してください。
列挙型は、構文上の糖衣を加えた単なる整数です。したがって、重複がないことを確認する場合は、int にキャストすることでそれらを結合できます。
ただし、きれいなコードにはなりません。私はほとんどの場合、列挙型の使用を避けるようにしています。通常、コード内で列挙型を繁殖させると、繰り返しの case ステートメントやその他の厄介なアンチパターンが生まれるのは時間の問題です。
組み合わせの鍵 Enum
s は、値が 2 の累乗 (1、2、4、8 など) であることを確認して、それらに対してビット演算を実行できるようにすることです (|=
&=
)。それらの Enum
でタグ付けできます。 Flags
属性。の Anchor
Windows フォーム コントロールのプロパティは、そのようなコントロールの例です。フラグとしてマークされている場合、Visual Studio では、プロパティ デザイナーのドロップダウンで値を 1 つ選択する代わりに、値を確認できるようになります。
enum flags() の使用について説明する場合は、良い記事があります ここ.