Haben enums ein Limit für Mitglieder in C #?

8

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?

    
Gustavo Rubio 14.08.2009, 01:19
quelle

4 Antworten

16

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:

%Vor%

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.

    
Pavel Minaev 14.08.2009, 01:24
quelle
7

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.

    
Sam Harwell 14.08.2009 01:22
quelle
6

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.

    
Tamas Czinege 14.08.2009 01:32
quelle
1

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;

  1. Verwenden Sie sie, um andere Daten zu klassifizieren und zu definieren, jedoch nicht als Daten sich. Um klarer zu sein, würde ich 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.
  2. Verwenden Sie enums, wenn sich die Aufzählungsliste wahrscheinlich nicht ändert. Enums sind großartig für grundlegende Konzepte, aber arm für ständig wechselnde Ideen. Wenn Sie eine Aufzählung erstellen, handelt es sich um einen Vertrag mit Zukunft Programmierer, die Sie vermeiden wollen zu brechen.
  3. Wenn Sie eine Enumeration ändern müssen, dann haben Sie eine Regel, der alle folgen du fügst zum Ende hinzu, nicht zur Mitte. Die Alternative ist, dass Sie Definieren Sie für jede Aufzählung spezifische Werte und ändern Sie diese nicht. Das Punkt ist, dass Sie wahrscheinlich nicht wissen, wie andere Ihre verwenden Aufzählungen, die Werten zugrunde liegen und sie ändern, können für jeden Elend verursachen sonst mit Ihrem Code. Dies ist eine Größenordnung wichtiger für jedes System, das Daten persistiert.
  4. Die logische Folge von # 2 und # 3 ist, niemals ein Mitglied einer Aufzählung zu löschen. Es gibt bestimmte Höllenkreise für Programmierer, die dies in einer Codebasis tun, die von anderen benutzt wird.

Hoffentlich hat das die Antworten auf hilfreiche Weise erweitert.

    
drobertson 23.04.2016 18:45
quelle

Tags und Links