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?

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top