2012-11-26 22 views
9

Normalerweise, wenn Flag Aufzählungen Vergleich Ich benutze das folgende Format:Was ist der beste Weg, um Flags Enum zu vergleichen?

(value & flag) == flag; 

Aber manchmal stoße ich auf diese:

(value & flag) != 0; 

Nur frage mich, was die besser zu bedienen, oder sie persönlich nicht kommen Präferenz?

+1

Ich ersetzte Verwendung dieser (einschließlich 'Enum.HasFlag') mit separaten Hilfsmethoden, die eine viel sauberere API-Verwendung erzeugt und Code-Duplizierung reduziert. Siehe: http://hugoware.net/blog/enumeration-extensions-2-0 Seit ich eine Modifikation von Hugos Erweiterungen verwende, fühlen sich die Dinge viel besser an. :) –

Antwort

10

zu überprüfen, wie flag ein ein- ist Bit-Flag, sie sind gleichwertig. Wenn flag mehrere Bits hat,

(value & flag) == flag; 

ist eine logische UND (müssen alle Bits übereinstimmen), während

(value & flag) != 0; 

eine logische OR (eines der Bits übereinstimmen müssen).

4

Es geht nur um persönliche Vorlieben.

Die Leistung der beiden wird ungefähr identisch sein, und das Ergebnis wird immer identisch sein. (Angenommen, eine single-threaded Umgebung.)

Das zweite Beispiel Kopieren/Pasten ein bisschen einfacher, denke ich.

Das zweite Beispiel ist auch ein wenig weniger anfällig für Threading-Probleme (wenn flag in der Mitte des Ausdrucks mutiert wird, können seltsame Dinge in der ersten passieren).

16

, wenn Sie .net 4 oder höher verwenden verwenden Enum.HasFlag statt

In der Tat diese Methode der Überprüfung erster Art und Weise verwendet, sondern bieten mehr klare Art und Weise Fahnen So lange

+0

Was ist langsamer als die oben genannten Operationen! –

+1

Ja, es könnte langsamer sein, aber die meisten Fälle macht es nicht sinnvoll, wenn wir aus der Sicht der Leistung gegenüber Clear-Code –

+0

Beachten Sie, dass diese Methode der ersten Zeile in der Original Post entspricht. Wenn "flag" kein Ein-Bit-Wert ist (d. H. Keine Potenz von 2 oder "MinValue" für eine unterzeichnete Ganzzahl mit Vorzeichen), ist dies wichtig (vgl. Andere Antworten). –

2

Wenn Sie Wert gegenüber Composite-Flag überprüft, wie zum Beispiel Wert: 0x0111, Fahnen: 0x0101 dann bedeutet (value & flags) == flags „alle Flags gesetzt sind“, und (value & flags) != 0 bedeutet „jede Flag gesetzt ist“.

+0

Upvoted, aber Sie sollten bearbeiten, um die benötigten Klammern zu setzen. –

Verwandte Themen