Wie mehrere Staaten in einer Variablen speichern?
-
13-09-2019 - |
Frage
Ihr Objekt Item
hat mehrere binäre Zustände, die kombiniert werden können,
bool CanBeSold;
bool CanBeBought;
bool CanBeExchanged;
ich brauche aktuelle Kombination von Werten in einer Variablen zu speichern. Der Grund ist, dass ich diesen Wert in DB speichern müssen. In C ++ Ich würde eine Bitmaske erstellen wo ein Zustand einnimmt etwas wenig. Ist es gute Praxis in .NET?
Lösung
Sie können eine Aufzählung mit dem Flags
Attribute verwenden:
[Flags]
enum MyStates {
CanBeSold = 1,
CanBeBought = 2,
CanBeExchanged = 4
}
Da Aufzählungen sind integrale Datentypen unter Sie sie in der üblichen Art und Weise kombinieren können:
state = MyStates.CanBeSold | MyStates.CanBeExchanged
Beachten Sie, dass dies nur funktioniert, wenn die ENUM-Werte sind Zweierpotenzen (wie Doug Ferguson in einem darauf hingewiesen Kommentar), so können sie leicht kombiniert werden und sich nicht überlappen, wenn mehrere Einsen gesetzt werden.
Sie können auch Werte wie Kombinationen von mehreren anderen Werten definieren:
CanBeSoldOrBought = CanBeSold | CanBeBought
oder
CanBeSoldOrBought = 3
, die dann funktioniert auch wie erwartet. Dies kann beispielsweise für die Dateiberechtigungen zu sehen, wo in der Regel Lese-Schreib eine Kombination aus dem Lesen und Schreiben Bits.
Und ja, das ist schon eine gängige Praxis. Das Framework selbst nutzt es auch an mehreren Stellen.
Der üblicher Weg zu überprüfen für ein bestimmtes Bit gesetzt wird, wird dann
if ((state & MyStates.CanBeSold) != 0) { ... }
Andere Tipps
eine ENUM erstellen, wo die Werte auf Bits in einer ganzen Zahl entsprechen. Hinzufügen die Flags-Attribut aktiviert Sie einige mehr Bit-Operationen auf den ENUM-Werten zu tun.
[Flags]
public enum CanBe {
Sold = 1,
Bought = 2,
Exchanged = 4
}
Jetzt können Sie nur die oder Betreiber zwischen den Werten verwenden:
CanBe can = CabBe.Sold | CanBe.Exchanged.
Sie können einen Zustand mit der hinzufügen | = operator:
can |= CanBe.Sold;
oder mehr Zustände:
can |= CanBe.Sold | CanBe.Bought;
Sie können einen Zustand halten mit dem & Operator =:
can &= CanBe.Sold;
oder mehr Zustände:
can &= CanBe.Sold | CanBe.Bought;
Sie können Zustände entfernen, indem Sie ~ Operator eine Ergänzung zu einem Wert zu erstellen:
can &= ~CabBe.Bough;
oder seveal heißt es:
can &= ~(CabBe.Bough | CanBe.Exchanged);
Sie können für einen Zustand, überprüfen Sie den Operator &:
if ((can & CanBe.Sold) != 0) ...
oder mehr Staaten auf einmal:
if ((can & (CanBe.Sold | CanBe.Bought)) != 0) ...
Oder überprüfen Sie, dass mehrere Staaten sind alle gesetzt:
if ((can & (CanBe.Sold | CanBe.Bought)) == (CanBe.Sold | CanBe.Bought)) ...
Sie können dies tun, mit Bitmasken auch in .NET.
In Ihrem Enum Sie Ihre Zustände als Werte definieren
public enum ItemState { CanBeSold = 1; CanBeBought = 2; CanBeExchanged = 4 }
Dann in Ihrem Objekt, können Sie
if (item.State ^ ItemState.CanBeSold) ....
Sie können eine Flags ENUM verwenden, um mit jedem Bit angegeben
[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;