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.
Feature | Java | C# |
---|---|---|
Constructors | Supported | Not supported |
Methods | Supported | Requires extension methods |
Instance variables | Supported | Requires custom attributes or dictionaries |
Values | Immutable | Mutable |
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.
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!