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>
列挙値のカスタム属性にアクセスすると、関連付けられたプロパティを取得できます。
これは拡張メソッドとカスタム属性を使用した Sun の Planet 列挙型と同等の C#:
<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 Enum: どちらがより多くの機能を提供しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。