Eine Überlegung für den Anwendungsfall, in dem eine Standardaufzählung gewünscht wird, ist die Verwendung einer nullbaren Variablen. Wenn eine Null empfangen wird, kann sie im richtigen Teil des Codes in die Standardeinstellung übersetzt werden, und diese Standardeinstellung muss im Rest des Codes nicht bekannt sein (der nur eine Null weitergibt).
ErikE
Antworten:
381
Es ist das Mitglied der Aufzählung, das den Wert darstellt 0. Insbesondere aus der Dokumentation :
Der Standardwert von a enum Eist der vom Ausdruck erzeugte Wert (E)0.
Nehmen Sie als Beispiel die folgende Aufzählung:
enum E
{Foo,Bar,Baz,Quux}
Ohne die Standardwerte zu überschreiben, wird beim Drucken default(E)zurückgegeben, Fooda es sich um das erste Element handelt.
Es ist jedoch nicht immer der Fall, dass 0eine Aufzählung vom ersten Mitglied vertreten wird. Wenn Sie dies beispielsweise tun:
enum F
{// Give each element a custom valueFoo=1,Bar=2,Baz=3,Quux=0}
Drucken default(F)gibt Ihnen Quuxnicht Foo.
Wenn keines der Elemente in einer Aufzählung Gentspricht 0:
enum G
{Foo=1,Bar=2,Baz=3,Quux=4}
default(G)Gibt buchstäblich zurück 0, obwohl sein Typ unverändert bleibt G(wie in den obigen Dokumenten angegeben, eine Umwandlung in den angegebenen Aufzählungstyp).
Danke, und was ist mit Aufzählungen, die mit char anstelle von int definiert wurden? zB Aufzählungsstatus {Aktiv = 'A', Inaktiv = 'I'}
Fernando Torres
3
@ Fernando Torres: Immer noch 0, es sei denn, einer Ihrer Aufzählungswerte entspricht '\0'oder default(char), was höchst unwahrscheinlich ist, da default(char)das NUL-Zeichen dem Zeichencode 0 entspricht.
BoltClock
Ich habe (fälschlicherweise?) Angenommen , dass die Verwendung des DefaultValueAttributs - so etwas wie System.ComponentModel.DefaultValue(MyEnum.Blah)- das Verhalten von ändern würde, default(MyEnum)aber dennoch 0 ergibt. Gibt es keine Möglichkeit, eine Abstraktion für einen enumWert um den Standardwert herum zu erstellen ?
Craig Silver
2
@Craig Silver: Das DefaultValue-Attribut gilt für Eigenschaften. Eine Aufzählung ist ein Typ. Daher hat DefaultValue keine Auswirkung auf den Aufzählungstyp insgesamt. Ich nehme an, Sie könnten dies mit einer Art Erweiterungsmethode
umgehen
11
Ich denke, es ist ziemlich gefährlich, sich auf die Reihenfolge der Werte in einer Aufzählung zu verlassen und anzunehmen, dass die erste immer die Standardeinstellung ist. Dies ist eine gute Vorgehensweise, wenn Sie den Standardwert schützen möchten.
enum E
{Foo=0,Bar,Baz,Quux}
Andernfalls ist nur ein nachlässiger Refactor der Bestellung erforderlich, und Sie haben eine völlig andere Standardeinstellung.
Entschuldigung, du liegst falsch. Ich habe das gleiche angenommen, aber wenn Sie Foonach Barbeiden setzen Foound Barden Wert 0 haben und E.Foo == E.Barzurückkehren true. Es ist so dumm und nicht
Antworten:
Es ist das Mitglied der Aufzählung, das den Wert darstellt
0
. Insbesondere aus der Dokumentation :Nehmen Sie als Beispiel die folgende Aufzählung:
Ohne die Standardwerte zu überschreiben, wird beim Drucken
default(E)
zurückgegeben,Foo
da es sich um das erste Element handelt.Es ist jedoch nicht immer der Fall, dass
0
eine Aufzählung vom ersten Mitglied vertreten wird. Wenn Sie dies beispielsweise tun:Drucken
default(F)
gibt IhnenQuux
nichtFoo
.Wenn keines der Elemente in einer Aufzählung
G
entspricht0
:default(G)
Gibt buchstäblich zurück0
, obwohl sein Typ unverändert bleibtG
(wie in den obigen Dokumenten angegeben, eine Umwandlung in den angegebenen Aufzählungstyp).quelle
'\0'
oderdefault(char)
, was höchst unwahrscheinlich ist, dadefault(char)
das NUL-Zeichen dem Zeichencode 0 entspricht.DefaultValue
Attributs - so etwas wieSystem.ComponentModel.DefaultValue(MyEnum.Blah)
- das Verhalten von ändern würde,default(MyEnum)
aber dennoch 0 ergibt. Gibt es keine Möglichkeit, eine Abstraktion für einenenum
Wert um den Standardwert herum zu erstellen ?Ich denke, es ist ziemlich gefährlich, sich auf die Reihenfolge der Werte in einer Aufzählung zu verlassen und anzunehmen, dass die erste immer die Standardeinstellung ist. Dies ist eine gute Vorgehensweise, wenn Sie den Standardwert schützen möchten.
Andernfalls ist nur ein nachlässiger Refactor der Bestellung erforderlich, und Sie haben eine völlig andere Standardeinstellung.
quelle
Foo
nachBar
beiden setzenFoo
undBar
den Wert 0 haben undE.Foo == E.Bar
zurückkehrentrue
. Es ist so dumm und nicht