Java-Enums bieten eine leistungsstarke Möglichkeit, Konstanten mit zusätzlicher Funktionalität wie Konstruktoren, Methoden und Instanzvariablen zu definieren. Obwohl C#-Aufzählungen auf den ersten Blick einfacher erscheinen mögen, weisen sie im Vergleich zur robusten Java-Implementierung Nachteile auf.
Feature | Java | C# |
---|---|---|
Constructors | Supported | Not supported |
Methods | Supported | Requires extension methods |
Instance variables | Supported | Requires custom attributes or dictionaries |
Values | Immutable | Mutable |
Erweiterungsmethoden : Um eine ähnliche Funktionalität wie Java-Enums hinzuzufügen, ermöglicht C# die Definition von Erweiterungsmethoden für Enums. Der folgende Code stellt beispielsweise Methoden zur Berechnung der Oberflächengravitation und des Oberflächengewichts bereit:
<code class="csharp">public static class Planets { public static double GetSurfaceGravity(this Planet p) { /* ... */ } public static double GetSurfaceWeight(this Planet p, double otherMass) { /* ... */ } }</code>
Benutzerdefinierte Attribute: Benutzerdefinierte Attribute können verwendet werden, um zusätzliche Informationen zu Aufzählungen zu speichern. Hier ist eine Beispielimplementierung:
<code class="csharp">[PlanetAttr(3.303e+23, 2.4397e6)] public enum Planet { MERCURY, VENUS, EARTH, // ... } public class PlanetAttr : Attribute { public double Mass { get; private set; } public double Radius { get; private set; } public PlanetAttr(double mass, double radius) { Mass = mass; Radius = radius; } }</code>
Durch Zugriff auf das benutzerdefinierte Attribut für einen Enum-Wert können Sie die zugehörigen Eigenschaften abrufen.
Hier ist ein C#-Äquivalent zur Sun's Planet-Enumeration unter Verwendung von Erweiterungsmethoden und benutzerdefinierten Attributen:
<code class="csharp">public enum Planet { [PlanetAttr(3.303e+23, 2.4397e6)] MERCURY, [PlanetAttr(4.869e+24, 6.0518e6)] VENUS, [PlanetAttr(5.976e+24, 6.37814e6)] EARTH, // ... } public static class Planets { public const double G = 6.67300E-11; public static double GetSurfaceGravity(this Planet p) { PlanetAttr attr = GetAttr(p); return G * attr.Mass / (attr.Radius * attr.Radius); } public static double GetSurfaceWeight(this Planet p, double otherMass) { return otherMass * p.GetSurfaceGravity(); } private static PlanetAttr GetAttr(Planet p) { FieldInfo field = typeof(Planet).GetField(Enum.GetName(typeof(Planet), p)); return field.GetCustomAttribute<PlanetAttr>(); } }</code>
Dieser Code definiert die Planet-Enumeration mit benutzerdefinierten Attributen für Masse und Radius. Die Planets-Klasse bietet Erweiterungsmethoden zur Berechnung der Oberflächenschwerkraft und des Oberflächengewichts, die über die Aufzählungen selbst zugänglich sind.
Das obige ist der detaillierte Inhalt vonC# vs. Java-Enums: Welches bietet mehr Funktionalität?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!