Ist es in C # möglich, einen Aufzählungstyp mit einem Attribut zu dekorieren oder etwas anderes zu tun, um den Standardwert anzugeben, ohne dass die Werte geändert werden müssen? Die erforderlichen Zahlen können aus irgendeinem Grund in Stein gemeißelt sein, und es wäre praktisch, weiterhin die Kontrolle über die Standardeinstellungen zu haben.
enum Orientation
{
None = -1,
North = 0,
East = 1,
South = 2,
West = 3
}
Orientation o; // Is 'North' by default.
int
s in der Zusammenfassung zu vergleichen , einfach weil sie zufällig als numerische Typen implementiert sind. Wir könnten Aufzählungen als Zeichenfolgen implementieren, und dies würde ihre Nützlichkeit nicht ändern. Ich betrachte die Antwort hier als Einschränkung der Ausdruckskraft der C # -Sprache; Die Einschränkung ist sicherlich nicht in der Idee enthalten, "Werte von einer eingeschränkten Menge zu unterscheiden".enum
s als Konstrukte auf Typebene zu betrachten, insbesondere als Summentypen (oder siehe hier . Das heißt, betrachten Sie jede Aufzählung als einen bestimmten Typ, wobei sich alle Werte dieses Typs von den Werten aller anderen Aufzählungen unterscheiden. Aus einer solchen Denkweise heraus ist es für Aufzählungen unmöglich, irgendeinen Wert zu teilen , und tatsächlich fällt diese Abstraktion auseinander, wenn man bedenkt, dass die Standardeinstellung von0
kann für eine gegebene Aufzählung gültig sein kann oder nicht, und ist einfach in jede Aufzählung mit Schuhen besetzt.Antworten:
Der Standardwert für a
enum
(tatsächlich jeder Werttyp) ist 0 - auch wenn dies kein gültiger Wert dafür istenum
. Es kann nicht geändert werden.quelle
Der Standardwert einer Aufzählung ist Null. Wenn Sie also einen Enumerator als Standardwert festlegen möchten, setzen Sie diesen auf Null und alle anderen Enumeratoren auf Nicht-Null (der erste Enumerator mit dem Wert Null ist der Standardwert für diese Aufzählung, wenn mehrere Enumeratoren vorhanden sind mit dem Wert Null).
Wenn Ihre Enumeratoren keine expliziten Werte benötigen, stellen Sie einfach sicher, dass der erste Enumerator derjenige ist, den Sie als Standard-Enumerator verwenden möchten, da "Standardmäßig hat der erste Enumerator den Wert 0 und der Wert jedes aufeinanderfolgenden Enumerators wird um erhöht 1. " ( C # Referenz )
quelle
Wenn Null nicht als der richtige Standardwert funktioniert, können Sie mithilfe des Komponentenmodells eine Problemumgehung für die Aufzählung definieren:
und dann können Sie anrufen:
Hinweis: Sie müssen die folgende Zeile oben in die Datei einfügen:
Dies ändert nicht den tatsächlichen Standardwert für die C # -Sprache der Aufzählung, bietet jedoch eine Möglichkeit, den gewünschten Standardwert anzugeben (und abzurufen).
quelle
else
Anweisung wie folgt zu ändern :return default(TEnum);
. Erstens werden die langsamerenEnum.GetValues(...).***
Anrufe reduziert , zweitens (und noch wichtiger) wird es für jeden Typ generisch sein, auch für Nicht-Aufzählungen. Außerdem schränken Sie den Code nicht ein, der nur für Aufzählungen verwendet werden soll, sodass potenzielle Ausnahmen behoben werden, wenn sie für Nicht-Aufzählungstypen verwendet werden.Die Standardeinstellung einer Aufzählung ist die Aufzählung, die gleich Null ist. Ich glaube nicht, dass dies durch Attribute oder andere Mittel veränderbar ist.
(MSDN sagt: "Der Standardwert einer Aufzählung E ist der Wert, der durch den Ausdruck (E) 0 erzeugt wird.")
quelle
Sie können nicht, aber wenn Sie wollen, können Sie einen Trick machen. :) :)
Verwendung dieser Struktur als einfache Aufzählung.
Wenn Sie pa == Orientation.East (oder einen beliebigen Wert) erstellen können, um
den Trick selbst zu verwenden, müssen Sie von int per Code konvertieren.
dort die Umsetzung:
quelle
value + 1
, ansonsten jetzt Ihredefault(Orientation)
RetourenEast
. Machen Sie den Konstruktor auch privat. Guter Ansatz.Eine weitere Möglichkeit, die hilfreich sein könnte - die Verwendung eines "Alias". Beispielsweise:
quelle
Status s = default(Status);
keines der Statusmitglieder, das
er den Wert von hat(Staus) 0
. Letzteres kann direkt geschrieben werden, da Aufzählungen in Ganzzahlen umgewandelt werden können. Bei der Deserialisierung schlägt dies jedoch fehl, da das Framework sicherstellt, dass eine Aufzählung immer an ein gültiges Mitglied deserialisiert wird. Ihr Code ist vollkommen gültig, wenn Sie die ZeileNew = 10
in ändernNew = 0
.Tatsächlich
enum
ist der Standardwert von an das erste Element inenum
dessen Wert0
.Also zum Beispiel:
quelle
Console.WriteLine(Animals.Pony);
druckt "Cat")The default value of enum is the enummember equal to 0 or the first element(if value is not specified)
... Aber ich hatte kritische Probleme mit der Verwendung von Enum in meinen Projekten und habe es überwunden, indem ich unten etwas getan habe ... Wie auch immer mein Bedarf mit der Klassenstufe zusammenhängt ...und erhaltenes erwartetes Ergebnis
Was ist nun, wenn der Wert von der Datenbank kommt? Ok, in diesem Szenario ... Übergeben Sie den Wert in die unten stehende Funktion und es wird der Wert in enum konvertiert ... unter der Funktion werden verschiedene Szenarien behandelt und es ist generisch ... und glauben Sie mir, dass es so ist sehr schnell ..... :)
quelle
Der Standardwert für einen Aufzählungstyp ist 0:
" Standardmäßig hat der erste Enumerator den Wert 0, und der Wert jedes aufeinanderfolgenden Enumerators wird um 1 erhöht. "
" Der Werttyp enum hat den Wert, der durch den Ausdruck (E) 0 erzeugt wird, wobei E die Aufzählungskennung ist. "
Sie können die Dokumentation für C # Enum überprüfen hier , und die Dokumentation für C # Standardwerte Tabelle hier .
quelle
Wenn Sie die Standardaufzählung als die Aufzählung mit dem kleinsten Wert definieren, können Sie Folgendes verwenden:
Dies setzt nicht voraus, dass die Aufzählung einen Nullwert hat.
quelle
Der Standardwert ist der erste in der Definition. Beispielsweise:
Dies wird zurückkehren
His
quelle
Wenn Sie die Eigenschaft auf null setzen, wird Orientations.None on get zurückgegeben. Die Eigenschaft _orientation ist standardmäßig null.
quelle
Dann können Sie im Code verwenden
quelle