Aufzählungen können den Code sicherlich lesbarer machen. Es gibt noch ein paar Dinge zu beachten (zumindest in .net)
Da der zugrunde liegende Speicher einer Aufzählung ein int ist, ist der Standardwert Null. Stellen Sie daher sicher, dass 0 ein sinnvoller Standardwert ist. (Zum Beispiel haben Strukturen beim Erstellen alle Felder beim Erstellen auf Null gesetzt, daher gibt es keine Möglichkeit, einen anderen Standard als 0 anzugeben. Wenn Sie keinen 0-Wert haben, können Sie die Aufzählung nicht einmal testen, ohne sie in int umzuwandeln schlechter Stil.)
Wenn Ihre Aufzählungen für Ihren Code privat sind (niemals öffentlich zugänglich gemacht), können Sie hier aufhören zu lesen.
Wenn Ihre Aufzählungen veröffentlicht sind in irgendeiner Weise zu externem Code und / oder außerhalb des Programms gespeichert, können Sie diese explizit Nummerierung. Der Compiler nummeriert sie automatisch von 0, aber wenn Sie Ihre Aufzählungen neu anordnen, ohne ihnen Werte zu geben, können Fehler auftreten.
Ich kann legal schreiben
WriteMode illegalButWorks = (WriteMode)1000000;
file.Write( data, illegalButWorks );
Um dem entgegenzuwirken, muss jeder Code, der eine Aufzählung verwendet, deren Sie sich nicht sicher sind (z. B. öffentliche API), überprüfen, ob die Aufzählung gültig ist. Sie tun dies über
if (!Enum.IsDefined(typeof(WriteMode), userValue))
throw new ArgumentException("userValue");
Die einzige Einschränkung Enum.IsDefined
ist, dass es Reflexion verwendet und langsamer ist. Es gibt auch ein Versionsproblem. Wenn Sie den Aufzählungswert häufig überprüfen müssen, ist Folgendes besser:
public static bool CheckWriteModeEnumValue(WriteMode writeMode)
{
switch( writeMode )
{
case WriteMode.Append:
case WriteMode.OverWrite:
break;
default:
Debug.Assert(false, "The WriteMode '" + writeMode + "' is not valid.");
return false;
}
return true;
}
Das Versionsproblem besteht darin, dass alter Code möglicherweise nur mit den 2 Aufzählungen umgehen kann. Wenn Sie einen dritten Wert hinzufügen, ist Enum.IsDefined wahr, aber der alte Code kann nicht unbedingt damit umgehen. Hoppla.
Es gibt noch mehr Spaß, den Sie mit [Flags]
Aufzählungen machen können, und der Validierungscode dafür ist etwas anders.
Ich werde auch beachten, dass Sie aus Gründen der Portabilität den Aufruf ToString()
der Enumeration verwenden und Enum.Parse()
beim Einlesen verwenden sollten. Beide ToString()
und Enum.Parse()
können damit umgehen[Flags]
ENUM ist auch, also gibt es keinen Grund , sie nicht zu verwenden. Wohlgemerkt, es ist eine weitere Gefahr, denn jetzt können Sie nicht einmal den Namen der Aufzählung ändern, ohne möglicherweise den Code zu brechen.
Manchmal müssen Sie also alles oben Genannte abwägen, wenn Sie sich fragen. Kann ich mit nur einem Narren davonkommen?