VB.net で列挙型を組み合わせる方法はありますか?
5 に答える
あなたが望むのはフラグ型の列挙型だと思います。
列挙型の先頭に 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 が列挙型に設定されます
設定内容を確認するには:
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 (よりビット単位の計算) を使用して、チェックしている Enum 値でユーザーの列挙値を確認します。
//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、タイラー
enum flags() の使用について検討している場合は、ここに良い記事があります。
あなたの質問を正しく理解できれば、異なる列挙型を組み合わせたいと思うでしょう。では、1 つの変数に 2 つの異なる列挙型のいずれかからの値を格納できますか? 1つの列挙型の2つの異なる値を組み合わせて保存することについて質問している場合は、Dave Arkellの説明を見ることができます
列挙型は、いくつかの構文糖衣を含む単なる整数です。したがって、オーバーラップがないことを確認した場合は、int にキャストしてそれらを組み合わせることができます。
ただし、きれいなコードにはなりません。ほとんどの場合、列挙型を使用しないようにしています。通常、コード内で enum を繁殖させた場合、case ステートメントの繰り返しやその他の厄介なアンチパターンが発生するのは時間の問題です。
組み合わせ s の鍵Enum
は、値が 2 のべき乗 (1、2、4、8 など) であることを確認して、それらに対してビット演算を実行できるようにすることです ( |=
&=
)。これらの は、属性Enum
でタグ付けできます。Flags
Windows フォーム コントロールのAnchor
プロパティは、このようなコントロールの例です。フラグとしてマークされている場合、Visual Studio では、プロパティ デザイナーのドロップダウンで値を 1 つ選択する代わりに、値を確認できます。