2009-02-26 9 views
0

Ich sah einige .NET 2.0-Code, der so aussah:Zwingende int auf ein bisschen Enum

public enum abc : int 
{ 
    value1 = 1, 
    value2 = 2, 
    value3 = 4 
} 

etc ...

Jetzt weiß ich, die ENUM-Flaggen für Bit-Werte verwendet werden können (wie oben, richtig?), also kannst du | tun "oder" & usw., aber was ist der Grund dafür, das nicht zu benutzen? Was ist der Punkt beim Überschreiben von int?

Wenn ich eine Enumeration für die Auswahl mehrerer Werte entwerfe, würde ich das Flags-Attribut verwenden und nichts überschreiben (was ich nicht verstehe). Was bedeutet das oben Gesagte?

Dank

Antwort

9

Es ist nicht "überschreiben" int, es gibt an, welchen Typ die Aufzählung basiert. Der Standardwert ist int, so dass dies tatsächlich nichts erreicht, aber in einigen Fällen möchten Sie möglicherweise eine Enum auf long basieren, um mehr Flags zu speichern, oder byte Speicherplatz zu sparen, wenn es sehr viele Instanzen der enum gibt und es nur hat ein paar Werte, aber die Empfehlung in den Framework-Design-Richtlinien ist zu verwenden int, es sei denn, Sie haben einen sehr guten Grund nicht zu.

Wenn dies eine Flag-Enumeration sein soll, dann sollte es mit [Flags] markiert werden, und dies scheint hier die Absicht zu sein, so dass die Auslassung wie ein Fehler aussieht. Sie können die Werte weiterhin mit den bitweisen Operatoren kombinieren, auch wenn sie nicht mit [Flags] markiert sind, aber aus dem Speicher erhalte ich eine Compiler-Warnung (oder es könnte eine FxCop-Warnung oder möglicherweise eine ReSharper-Warnung sein ...).

2

Der „: int“ wird spezifiziert, was für ENUM-Werte als die zugrunde liegende Typ zu verwenden; Jeder andere Integral-Typ als Char kann hier verwendet werden. Der Standardwert ist int, daher ist es in diesem Fall überflüssig.

0

Ich sehe keinen Vorteil. Wahrscheinlich mangelnde Erfahrung seitens des Programmierers.

2

FlagsAttribute teilt dem Benutzer nur mit, dass Felder in dieser Aufzählung kombiniert werden können; es setzt die Felder der Enum nicht auf "flaggable" Werte. Dies musst du selbst tun, genau wie du es bereits getan hast.

0

Wenn Sie das Szenario fragen bestimmte Werte für die Wahl, ich weiß nicht, ein gutes Beispiel freihändig, aber ich kann nützlich etwas wie

enum Color = { 
    Red = 0xFF0000, 
    Green = 0x00FF00, 
    Blue = 0x0000FF } 

vielleicht vorstellen.

0

Das Setzen der Werte in einer Nicht-Flags-Enumeration, um eine 1-Hot-Codierung zu verwenden, nur um eine 1-Hot-Codierung zu verwenden, macht keinen Sinn. Ich nehme an, es könnte einen Sinn ergeben, wenn du dachtest, du könntest es in Zukunft zu einem Flags-Enum machen. Andernfalls sollten die Werte entweder nicht überschrieben oder ihnen ein Wert zugewiesen werden (z. B. Color.Red = 0xFF0000).

0

In Bezug auf die ": Int" Angabe der zugrunde liegenden Art, wenn ich das sah, würde ich mich umsehen und sehen, ob sie alle ihre enums so delcare. Wenn ja, haben sie wahrscheinlich gerade so Enums zu schreiben gelernt (oder sie sind vielleicht ein hyper-expliziter Coder). Wenn jedoch nur diese Enumeration auf diese Weise deklariert wurde, versucht der Programmierer vielleicht etwas zu sagen (was vielleicht besser mit einem Kommentar gesagt wurde), dass es entscheidend ist, dass dieser einen int-Typ hat. Vielleicht wird es irgendwo binär serialisiert oder deserialisiert.

Wie für die [Flags] -Attribut, so weit wie C# betrifft, so können Sie bitweise Operatoren auf jeder ENUM nutzen, nicht nur diejenigen mit [Flags] erklärt. Von Ihrem obigen Beispiel ohne [Flags] ist die folgende völlig legal:

abc myAbcValue = value1 | Wert2;

Der Hauptunterschied in Bezug auf die [Flags] ist in den ToString() - und Parse() - Methoden von Enum. Ohne [Flags] gibt myAbvValue.ToString() "3" zurück, aber mit [Flags] gibt es "value1, value2" zurück. Ebenso mit den [Flags],

abc IhrAbcValue = (abc) Enum.Parse (typeof (abc), "Wert1, Wert2");

wird den zugrunde liegenden Wert von yourAbcValue bis 3.

Hinweis eingestellt, dass die IsDefined() -Methode von Enum() erlaubt es nicht für mehrere Werte mit [Flags] Aufzählungen, so:

Enum.IsDefined (typeof (abc), "value1, value2")

gibt false zurück, unabhängig von der Verwendung von [Flags].

Beachten Sie auch, dass [Flags] Informationen für jede Reflexion Zugang bietet und andere Sprachen kann die Beschränkung auf markierten Aufzählungen differntly zur normalen Aufzählungen behandeln.