一つの変数で、いくつかの状態を保存する方法は?
-
13-09-2019 - |
質問
マイオブジェクトItem
を組み合わせることができるいくつかのバイナリ状態を有する
bool CanBeSold;
bool CanBeBought;
bool CanBeExchanged;
私は1つの変数に値を現在の組み合わせを格納する必要があります。理由 私はDBにこの値を格納する必要があるということです。 C ++では、私はビットマスクを作成します どこ1つの状態は、いくつかのビットを占めています。それは、.NETに良い練習ですか?
解決
あなたはFlags
属性で列挙を使用することができます:
[Flags]
enum MyStates {
CanBeSold = 1,
CanBeBought = 2,
CanBeExchanged = 4
}
あなたは通常の方法でそれらを組み合わせることができます下に列挙型は、整数データ型ですのでます:
state = MyStates.CanBeSold | MyStates.CanBeExchanged
ダグファーガソンにはで指摘したようにenum値は2の累乗(ある場合にのみ動作することに注意してくださいコメント)、彼らは簡単に組み合わせることができ、複数のものが設定されている時に重ならないようにします。
また、他の複数の値の組み合わせとして値を定義することができます:
CanBeSoldOrBought = CanBeSold | CanBeBought
または
CanBeSoldOrBought = 3
これは期待通り、その後も動作します。これは、読み書きは、通常、読むの組み合わせで、ビットを書き込み、ファイルのアクセス権のために例えば見ることができます。
そして、はい、それは非常に一般的な方法です。フレームワーク自体はまた、いくつかの場所でそれを使用します。
に通常の方法のチェックの特定のビットが設定されているため、
if ((state & MyStates.CanBeSold) != 0) { ... }
他のヒント
の値は、整数のビットに対応する列挙型を作成します。フラグ属性を追加すると、列挙型の値についてのいくつかのより多くのビット操作を行うためにあなたを可能にします。
[Flags]
public enum CanBe {
Sold = 1,
Bought = 2,
Exchanged = 4
}
今、あなただけの値の間または演算子を使用することができます:
CanBe can = CabBe.Sold | CanBe.Exchanged.
あなたがして状態を追加することができます| =演算子ます:
can |= CanBe.Sold;
あるいは、いくつかの州ます:
can |= CanBe.Sold | CanBe.Bought;
あなたは&=演算子と状態を保つことができます:
can &= CanBe.Sold;
あるいは、いくつかの州ます:
can &= CanBe.Sold | CanBe.Bought;
あなたは値を補完を作成するために、〜演算子を使って、状態を削除することができます:
can &= ~CabBe.Bough;
またはseveal状態:
can &= ~(CabBe.Bough | CanBe.Exchanged);
あなたは&演算子を使用して状態を確認することができます:
if ((can & CanBe.Sold) != 0) ...
それとも、いくつかの状態を一度ます:
if ((can & (CanBe.Sold | CanBe.Bought)) != 0) ...
それとも、いくつかの状態がすべて設定されていることを確認します:
if ((can & (CanBe.Sold | CanBe.Bought)) == (CanBe.Sold | CanBe.Bought)) ...
あなたも、.NETでのビットマスクでこれを行うことができます。
あなたの列挙型の中で、あなたが値としてあなたの状態を定義することができます。
public enum ItemState { CanBeSold = 1; CanBeBought = 2; CanBeExchanged = 4 }
次に、あなたのオブジェクト内で、あなたが行うことができます。
if (item.State ^ ItemState.CanBeSold) ....
あなたは指定された各ビットフラグ列挙型を使用することができます。
[Flags]
enum MyStates {
CanBeSold = 0x1,
CanBeBought = 0x2,
CanBeExchanged = 0x4,
}
MyStates m_Flags;
// to set a flag:
m_Flags |= MyStates.CanBeSold;
// to unset a flag:
m_Flags &= ~MyStates.CanBeSold;