Ich habe mich gefragt, ob der Enum-Strukturtyp eine Begrenzung für seine Mitglieder hat. Ich habe diese sehr große Liste von "Variablen", die ich in einem Enum oder als Konstanten in einer Klasse speichern muss, aber ich entschied mich schließlich, sie in einer Klasse zu speichern, aber ich bin ein bisschen neugierig auf die Begrenzung der Mitglieder eines Enums (falls vorhanden).
Also, haben Enums ein Limit für .Net?
Ja. Die Anzahl der Member mit unterschiedlichen Werten ist begrenzt durch den zugrunde liegenden Typ von enum
- standardmäßig ist dies Int32
, also kannst du so viele verschiedene Mitglieder bekommen (2 ^ 32 - ich finde es schwierig) dass Sie diese Grenze erreichen werden, aber Sie können den zugrunde liegenden Typ wie folgt explizit angeben:
Natürlich können Sie so viele Mitglieder haben, wie Sie möchten, wenn sie alle den gleichen Wert haben:
%Vor%In jedem Fall gibt es im C # -Compiler wahrscheinlich ein paar implementationsdefinierte Limits, aber ich würde erwarten, dass es MIN (Bereich-von-Int32, freier Speicher) ist, anstatt eine harte Grenze.
Aufgrund eines Limits im PE-Dateiformat können Sie wahrscheinlich einige 100.000.000 Werte nicht überschreiten. Vielleicht mehr, vielleicht weniger, aber definitiv kein Problem.
Aus der C # -Sprachspezifikation 3.0 , 1.10:
Das Speicherformat eines Aufzählungstyps und Bereich der möglichen Werte sind bestimmt durch den zugrunde liegenden Typ.
Obwohl ich nicht 100% sicher bin, würde ich erwarten, dass der Microsoft C # -Compiler nur nicht-negative Enum-Werte zulässt. Wenn also der zugrunde liegende Typ ein Int32 ist (standardmäßig), würde ich ungefähr 2 ^ 31 mögliche Werte erwarten Dies ist jedoch ein Implementierungsdetail, da es nicht angegeben ist. Wenn Sie mehr brauchen, machen Sie wahrscheinlich etwas falsch.
Sie könnten theoretisch int64 als Basistyp in der Enumeration verwenden und 2 ^ 63 mögliche Einträge erhalten. Andere haben Ihnen dazu ausgezeichnete Antworten gegeben.
Ich denke, es gibt eine zweite implizierte Frage von , ob Sie eine enum für etwas mit einer großen Anzahl von Elementen verwenden. Dies trifft in vielen Fällen direkt auf Ihr Projekt zu.
Eine der wichtigsten Überlegungen wäre die langfristige Wartbarkeit. Glauben Sie, dass das Unternehmen jemals die Liste der von Ihnen verwendeten Werte ändern wird? Wenn ja, muss eine Rückwärtskompatibilität zu früheren Listen bestehen? Wie bedeutsam könnte ein Problem sein? Je größer die Anzahl der Mitglieder in einem Enum ist, desto höher ist die Wahrscheinlichkeit, dass die Liste zu einem späteren Zeitpunkt geändert werden muss.
Enums sind großartig für viele Dinge. Sie sind sauber, schnell und einfach zu implementieren. Sie funktionieren hervorragend mit IntelliSense und erleichtern die Arbeit des nächsten Programmierers, besonders wenn die Namen klar, prägnant und bei Bedarf gut dokumentiert sind.
Das Problem ist eine Aufzählung kommt auch mit Nachteilen. Sie können problematisch sein, wenn sie jemals geändert werden müssen, insbesondere wenn die Klassen, die sie verwenden, dauerhaft gespeichert werden.
In den meisten Fällen werden Enums im Speicher als ihre zugrunde liegenden Werte gespeichert, nicht als ihre Namen.
%Vor% In diesem Beispiel würde der Wert InsuranceClass.Life
als Nummer 2 beibehalten.
Wenn ein anderer Programmierer eine kleine Änderung am System vornimmt und Pet dem Enum wie folgt hinzufügt:
%Vor%Alle Daten, die aus dem Speicher kommen, zeigen jetzt die Life Richtlinien als Pet Richtlinien an. Dies ist ein extrem einfacher Fehler und kann Bugs einführen, die schwer zu finden sind.
Das zweite wichtige Problem bei Enums ist, dass Sie bei jeder Änderung der Daten Ihr Programm neu erstellen und erneut bereitstellen müssen. Dies kann unterschiedliche Grade von Schmerz verursachen. Auf einem Webserver, der kein großes Problem darstellt, aber wenn es sich um eine App handelt, die auf 5000 Desktop-Systemen verwendet wird, haben Sie völlig andere Kosten, um Ihre Minilistenänderung erneut zu implementieren.
Wenn sich Ihre Liste wahrscheinlich regelmäßig ändert, sollten Sie ein System in Betracht ziehen, das diese Liste in einer anderen Form speichert, höchstwahrscheinlich außerhalb Ihres Codes. Datenbanken wurden speziell für dieses Szenario entwickelt oder es kann sogar eine einfache Konfigurationsdatei verwendet werden (nicht die bevorzugte Lösung). Eine intelligente Planung für Änderungen kann die Probleme beim Wiederherstellen und Neuinstallieren Ihrer Software reduzieren oder vermeiden.
Dies ist kein Vorschlag zur vorzeitigen Optimierung Ihres Systems für die Möglichkeit einer Änderung, sondern eher ein Vorschlag, den Code so zu strukturieren, dass eine wahrscheinliche Änderung in der Zukunft kein größeres Problem verursacht. Unterschiedliche Situationen erfordern unterschiedliche Entscheidungen.
Hier sind meine groben Faustregeln für die Verwendung von enums;
InsuranceClass.Life
verwenden
bestimmen, wie die anderen Daten in einer Klasse verwendet werden sollen, aber ich würde
nicht den zugrunde liegenden Wert von {pseudocode} InsuranceClass.Life = 3.00
und
Verwenden Sie den Wert selbst in Berechnungen. Enums sind keine Konstanten. Tun
das schafft Verwirrung. Hoffentlich hat das die Antworten auf hilfreiche Weise erweitert.