Ich habe unten eine Flaggenaufzählung.
[Flags]
public enum FlagTest
{
None = 0x0,
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4
}
Ich kann die if-Anweisung nicht als wahr bewerten lassen.
FlagTest testItem = FlagTest.Flag1 | FlagTest.Flag2;
if (testItem == FlagTest.Flag1)
{
// Do something,
// however This is never true.
}
Wie kann ich das wahr machen?
None
Flag mit dem Wert Null anzugeben . Siehe msdn.microsoft.com/en-us/library/vstudio/…&
Operator zum Vergleich,|
ist wie ein Zusatz:1|2=3
,5|2=7
,3&2=2
,7&2=2
,8&2=0
.0
bewertet zufalse
, alles andere zutrue
.Antworten:
In .NET 4 gibt es eine neue Methode Enum.HasFlag . So können Sie schreiben:
Das ist viel besser lesbar, IMO.
Die .NET-Quelle gibt an, dass dies dieselbe Logik wie die akzeptierte Antwort ausführt:
quelle
Enum
Klasse verwendet werden.(testItem & FlagTest.Flag1)
ist eine bitweise UND-Verknüpfung.FlagTest.Flag1
entspricht001
der Aufzählung von OP. Lassen Sie uns jetzt sagentestItem
hat Flag1 und Flag2 (so ist es bitweise101
):quelle
Für diejenigen, die Probleme haben, sich vorzustellen, was mit der akzeptierten Lösung passiert (was das ist),
testItem
(gemäß der Frage) ist definiert als,Dann ist in der if-Anweisung die linke Seite des Vergleichs:
Und die vollständige if-Anweisung (die als true ausgewertet wird, wenn gesetzt
flag1
isttestItem
),quelle
@ Phil-Devaney
Beachten Sie, dass Enum.HasFlag , außer in den einfachsten Fällen, im Vergleich zum manuellen Schreiben des Codes eine erhebliche Leistungsminderung mit sich bringt. Betrachten Sie den folgenden Code:
Über 10 Millionen Iterationen benötigt die HasFlags-Erweiterungsmethode satte 4793 ms, verglichen mit 27 ms für die standardmäßige bitweise Implementierung.
quelle
(«flag var» & «flag value») != 0
funktioniert bei mir nicht Die Bedingung schlägt immer fehl und mein Compiler (Mono 2.6.5 von Unity3D) meldet eine "Warnung CS0162: Nicht erreichbarer Code erkannt", wenn er in einem verwendet wirdif (…)
.… = 1, … = 2, … = 4
auf den Enum-Werten ist bei der Verwendung von entscheidender Bedeutung[Flags]
. Ich ging davon aus, dass es die Einträge bei1
Po2s automatisch starten und von Po2s vorrücken würde. Das Verhalten sieht in MS .NET und Unitys datiertem Mono konsistent aus. Ich entschuldige mich dafür.Ich habe dafür eine Erweiterungsmethode eingerichtet: verwandte Frage .
Grundsätzlich:
Dann können Sie tun:
Übrigens ist die Konvention, die ich für Enums verwende, Singular für Standard, Plural für Flags. Auf diese Weise wissen Sie anhand des Aufzählungsnamens, ob er mehrere Werte enthalten kann.
quelle
HasFlag
stattdessen die Erweiterung verwenden.Noch ein Ratschlag ... Führen Sie niemals die Standard-Binärprüfung mit dem Flag durch, dessen Wert "0" ist. Ihre Überprüfung dieser Flagge wird immer wahr sein.
Wenn Sie den Eingabeparameter binär gegen FullInfo prüfen, erhalten Sie:
bPRez ist immer wahr als ALLES & 0 immer == 0.
Stattdessen sollten Sie einfach überprüfen, ob der Wert der Eingabe 0 ist:
quelle
quelle
Für Bitoperationen müssen Sie bitweise Operatoren verwenden.
Dies sollte den Trick tun:
Bearbeiten: Meine if-Prüfung wurde behoben. Ich bin wieder in meine C / C ++ - Methoden zurückgekehrt (danke an Ryan Farley für den Hinweis).
quelle
In Bezug auf die Bearbeitung. Du kannst es nicht wahr machen. Ich schlage vor, dass Sie das, was Sie wollen, in eine andere Klasse (oder Erweiterungsmethode) einbinden, um der von Ihnen benötigten Syntax näher zu kommen.
dh
quelle
Versuche dies:
Grundsätzlich fragt Ihr Code, ob das Setzen beider Flags mit dem Setzen eines Flags identisch ist, was offensichtlich falsch ist. Der obige Code lässt nur das Flag1-Bit gesetzt, wenn es überhaupt gesetzt ist, und vergleicht dieses Ergebnis dann mit Flag1.quelle
Auch ohne [Flags] könnten Sie so etwas verwenden
oder wenn Sie eine Nullwert-Aufzählung haben
quelle