Betrachten Sie die folgende Enum und ein entsprechendes Nullwertfeld dieses Typs
%Vor%Alternativ könnte ich die enum und das entsprechende Feld als
deklarieren %Vor%Dieses nicht nullbare Feld wird auf den ersten Wert initialisiert, d. h. "Nicht angegeben", und ich erreiche das gleiche Ergebnis wie ein Nullwert ("Nicht spezifiziert" würde "option.HasValue" ersetzen).
Warum also eine Nullable? Irgendwelche Leistungsgewinne oder andere Vorteile?
Gemäß der Dokumentation :
Der zugrunde liegende Standardtyp des Aufzählungselemente ist int. Durch Standardmäßig hat der erste Enumerator die Wert 0 und der Wert von jedem aufeinanderfolgender Enumerator wird um erhöht 1.
...
Der Standardwert einer Enumeration E ist der Wert, der durch den Ausdruck (E) 0 erzeugt wird.
Es gibt auch die Möglichkeit, diesen Standardwert zu ändern:
%Vor% In diesem Fall ist Unspecified
nicht mehr der Standardwert.
Der einzige mögliche Vorteil, den ich sehen kann, wenn ich eine Nullable-Enumeration verwende, ist, dass der Nullwert nicht von der Definition der Enumeration abhängt.
Meiner Meinung nach sollten Sie entscheiden, welches Sie verwenden möchten, abhängig davon, ob Sie die Semantik von Standardwert oder nicht zugeordneten Wert benötigen.
Ich würde den zusätzlichen "unspezifizierten" Wert der Enumeration wählen. Mit einem nullbaren Wert machen Sie die Annahme, dass ein anderer Entwickler null passieren würde. Bei einem vollständigen Array von Werten gibt es keine Annahme - jede mögliche Option ist innerhalb dieser Wertemenge klar.
Der einzige Grund (abgesehen von der persönlichen Vorliebe), eine NULL-fähige Aufzählung zu verwenden, ist, wenn Sie sie sowohl mit als auch ohne NULL verwenden.
Wenn Sie eine Nullable-Enumeration verwenden, haben Sie nicht den Nullwert als einen der Werte. Sie können den Wert aus der Nullable-Eigenschaft abrufen und ihn woanders verwenden, wo der Nullwert kein möglicher Wert sein sollte.
Zusätzlich zu dem, was gesagt wurde, würde ich argumentieren, dass Performance-nullable Enums auch schlechter sind, da sie mehr Speicherzuweisungen ergeben.
Ein scheinbar unschuldig aussehender Code wie dieser:
%Vor%Kompiliert tatsächlich zu etwas wie diesem:
%Vor%Das gilt für alle Nullables, aber ich fand es besonders überraschend für Enums (und noch mehr für Booleans), da mein erster Instinkt war zu denken, dass dies vom Compiler optimiert wird, da es alle möglichen Werte im Voraus kennt und kann sie zwischenspeichern und verwenden.