Rumah  >  Artikel  >  Java  >  C# vs Java Enums: Mana Yang Menawarkan Lebih Banyak Fungsi?

C# vs Java Enums: Mana Yang Menawarkan Lebih Banyak Fungsi?

Barbara Streisand
Barbara Streisandasal
2024-11-01 15:25:30719semak imbas

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

C# vs Java Enums: A Comparison

Java enums menawarkan cara yang berkuasa untuk mentakrifkan pemalar dengan fungsi tambahan, seperti pembina, kaedah dan pembolehubah contoh. Walaupun C# enum mungkin kelihatan lebih mudah pada pandangan pertama, ia mempunyai kelemahan berbanding dengan pelaksanaan Java yang mantap.

Perbezaan Utama

Feature Java C#
Constructors Supported Not supported
Methods Supported Requires extension methods
Instance variables Supported Requires custom attributes or dictionaries
Values Immutable Mutable

Mengatasi Perbezaan

Kaedah Sambungan : Untuk menambah fungsi yang serupa dengan enum Java, C# membenarkan mentakrifkan kaedah sambungan pada enum. Contohnya, kod berikut menyediakan kaedah untuk mengira graviti permukaan dan berat permukaan:

<code class="csharp">public static class Planets
{
    public static double GetSurfaceGravity(this Planet p) { /* ... */ }
    public static double GetSurfaceWeight(this Planet p, double otherMass) { /* ... */ }
}</code>

Atribut Tersuai: Atribut tersuai boleh digunakan untuk menyimpan maklumat tambahan pada enum. Berikut ialah contoh pelaksanaan:

<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>

Dengan mengakses atribut tersuai pada nilai enum, anda boleh mendapatkan semula sifat yang berkaitan.

Contoh Planet Enum

Berikut ialah C# bersamaan dengan enum Planet Matahari menggunakan kaedah sambungan dan atribut tersuai:

<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>

Kod ini mentakrifkan enum Planet dengan atribut tersuai untuk jisim dan jejari. Kelas Planet menyediakan kaedah lanjutan untuk mengira graviti permukaan dan berat, yang boleh diakses melalui enum itu sendiri.

Atas ialah kandungan terperinci C# vs Java Enums: Mana Yang Menawarkan Lebih Banyak Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn