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中文网其他相关文章!