首頁 >Java >java教程 >C# 與 Java 枚舉:哪一個提供更多功能?

C# 與 Java 枚舉:哪一個提供更多功能?

Barbara Streisand
Barbara Streisand原創
2024-11-01 15:25:30819瀏覽

 C# vs Java Enums: Which One Offers More Functionality?

C# 與Java 枚舉:比較

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn