Warum verwenden Menschen immer Enum-Werte wie 0, 1, 2, 4, 8
und nicht 0, 1, 2, 3, 4
?
Hat dies etwas mit Bitoperationen usw. zu tun?
Ich würde mich sehr über einen kleinen Beispielausschnitt darüber freuen, wie dies richtig verwendet wird :)
[Flags]
public enum Permissions
{
None = 0,
Read = 1,
Write = 2,
Delete = 4
}
c#
permissions
enums
flags
Pascal
quelle
quelle
|
(und&
) darstellt. Die verschiedenen Antworten setzen voraus, dass Sie damit vertraut sind.Antworten:
Weil sie Zweierkräfte sind und ich das kann:
Und vielleicht später ...
Es ist ein Bitfeld, in dem jedes gesetzte Bit einer Berechtigung entspricht (oder was auch immer der aufgezählte Wert logisch entspricht). Wenn diese als definiert
1, 2, 3, ...
wären, könnten Sie auf diese Weise keine bitweisen Operatoren verwenden und aussagekräftige Ergebnisse erzielen. Um tiefer zu tauchen ...Beachten Sie hier ein Muster? Nehmen wir nun mein ursprüngliches Beispiel, dh
Dann...
Sehen? Sowohl das
Read
als auch dasWrite
Bit sind gesetzt, und ich kann dies unabhängig überprüfen (Beachten Sie auch, dass dasDelete
Bit nicht gesetzt ist und dieser Wert daher keine Berechtigung zum Löschen vermittelt).Es ermöglicht das Speichern mehrerer Flags in einem einzigen Bitfeld.
quelle
myEnum.IsSet
. Ich bin der Meinung, dass dies eine völlig nutzlose Abstraktion ist und nur dazu dient, das Tippen zu reduzieren, aber mehFlags
Attribut kaum mehr als "hübsches Drucken". Sie können einen Aufzählungswert unabhängig vom Vorhandensein des Attributs als Flag verwenden.0
ist nichtfalse
;false
istfalse
. Sie könnten jedoch schreibenif((permissions & Permissions.Write) > 0)
.(permissions & Permissions.Write) == Permissions.Write
können Sie jetztenum.HasFlag()
Wenn es aus den anderen Antworten immer noch nicht klar hervorgeht, denken Sie so darüber nach:
ist nur eine kürzere Art zu schreiben:
Es gibt acht Möglichkeiten, aber Sie können sie als Kombinationen von nur vier Mitgliedern darstellen. Wenn es 16 Möglichkeiten gäbe, könnten Sie sie als Kombinationen von nur fünf Mitgliedern darstellen. Wenn es vier Milliarden Möglichkeiten gäbe, könnten Sie sie als Kombinationen von nur 33 Mitgliedern darstellen! Es ist offensichtlich weitaus besser, nur 33 Mitglieder zu haben, von denen jedes (außer null) eine Zweierpotenz hat, als zu versuchen, vier Milliarden Gegenstände in einer Aufzählung zu benennen.
quelle
enum
mit vier Milliarden Mitgliedern. Und der traurige Teil ist, wahrscheinlich hat es jemand da draußen versucht.2 ** -infinity
als Zweierpotenz).Weil diese Werte eindeutige Bitpositionen in Binärform darstellen:
usw., so
BEARBEITEN:
3 in binär wird durch einen Wert von 1 sowohl an der Einsen- als auch an der Zweierstelle dargestellt. Es ist eigentlich das gleiche wie der Wert
1 | 2
. Wenn Sie also versuchen, die binären Stellen als Flags zu verwenden, um einen Zustand darzustellen, ist 3 normalerweise nicht aussagekräftig (es sei denn, es gibt einen logischen Wert, der tatsächlich die Kombination der beiden ist).Zur weiteren Verdeutlichung möchten Sie möglicherweise Ihre Beispielaufzählung wie folgt erweitern:
Deshalb in ich habe
Permissions.All
, habe ich auch implizitPermissions.Read
,Permissions.Write
undPermissions.Delete
quelle
3
es11
binär ist, dh nicht einem einzelnen gesetzten Bit zugeordnet ist, verlieren Sie die Fähigkeit, 1 Bit an einer beliebigen Position einem aussagekräftigen Wert zuzuordnen.2|3 == 1|3 == 1|2 == 3
. Also , wenn Sie einen Wert mit binären haben00000011
und Ihre Fahnen enthalten Werte1
,2
und3
, dann würden Sie nicht wissen , ob dieser Wert repräsentiert1 and 3
,2 and 3
,1 and 2
oderonly 3
. Das macht es viel weniger nützlich.Ich denke, so zu schreiben ist leichter zu verstehen und zu lesen, und Sie müssen es nicht berechnen.
quelle
Diese werden verwendet, um Bitflags darzustellen, die Kombinationen von Aufzählungswerten ermöglichen. Ich denke, es ist klarer, wenn Sie die Werte in Hex-Notation schreiben
quelle
4194304
mit 2 multiplizierst ? Wie wäre es0x400000
? Es ist viel einfacher0x800000
als die richtige Antwort zu erkennen als8388608
und es ist auch weniger fehleranfällig, den Hex-Wert einzugeben.0x10000
eine Zweierpotenz? Ja, es beginnt mit 1, 2, 4 oder 8 und hat danach alle Nullen. Sie müssen 0x10 nicht mental in 16 übersetzen (obwohl dies wahrscheinlich irgendwann zur zweiten Natur wird). Stellen Sie sich das einfach als "eine Potenz von 2" vor.Dies ist eigentlich eher ein Kommentar, aber da dies die Formatierung nicht unterstützen würde, wollte ich nur eine Methode einfügen, die ich zum Einrichten von Flag-Aufzählungen verwendet habe:
Ich finde diesen Ansatz besonders hilfreich während der Entwicklung, wenn Sie Ihre Flags in alphabetischer Reihenfolge halten möchten. Wenn Sie feststellen, dass Sie einen neuen Flag-Wert hinzufügen müssen, können Sie ihn einfach alphabetisch einfügen. Der einzige Wert, den Sie ändern müssen, ist der, dem er jetzt vorausgeht.
Beachten Sie jedoch, dass es nach der Veröffentlichung einer Lösung für ein Produktionssystem (insbesondere wenn die Aufzählung ohne enge Kopplung verfügbar ist, z. B. über einen Webdienst) dringend empfohlen wird, einen vorhandenen Wert innerhalb der Aufzählung nicht zu ändern.
quelle
Viele gute Antworten auf diese Frage ... Ich sage nur ... wenn Sie nicht mögen oder nicht leicht verstehen können, was die
<<
Syntax auszudrücken versucht ... Ich persönlich bevorzuge eine Alternative (und wage es zu sagen, einen einfachen Enum-Deklarationsstil). …LOG 513 == 513
So viel einfacher (zumindest für mich) zu verstehen. Richten Sie die aus ... beschreiben Sie das gewünschte Ergebnis, erhalten Sie das gewünschte Ergebnis. Keine "Berechnungen" erforderlich.
quelle