Java 枚舉提供了一種強大的方法來定義具有附加功能的常數,例如構造函數、方法和實例變數。雖然 C# 枚舉乍看之下似乎更簡單,但與 Java 的穩健實作相比,它們有缺點。
Feature | Java | C# |
---|---|---|
Constructors | Supported | Not supported |
Methods | Supported | Requires extension methods |
Instance variables | Supported | Requires custom attributes or dictionaries |
Values | Immutable | Mutable |
擴充方法: 為了加入類似Java 枚舉的功能,C# 允許在枚舉上定義擴充方法。例如,以下程式碼提供了計算表面重力和表面重量的方法:
<code class="csharp">public static class Planets { public static double GetSurfaceGravity(this Planet p) { /* ... */ } public static double GetSurfaceWeight(this Planet p, double otherMass) { /* ... */ } }</code>
自訂屬性:自訂屬性可用於儲存有關枚舉的附加資訊。以下是範例實作:
<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>
透過存取枚舉值的自訂屬性,您可以擷取關聯的屬性。
這裡是C# 相當於使用擴展方法和自訂屬性的Sun 的Planet 列舉:
<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>
此程式碼定義具有質量和半徑自訂屬性的Planet 枚舉。 Planets 類別提供了計算表面重力和重量的擴展方法,可以透過枚舉本身存取這些方法。
以上是C# 與 Java 枚舉:哪一個提供更多功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!