首页 >Java >java教程 >C# 和 Java 枚举有何不同?

C# 和 Java 枚举有何不同?

Linda Hamilton
Linda Hamilton原创
2024-11-02 01:07:02507浏览

How Do C# and Java Enums Differ?

了解 C# 和 Java 枚举之间的差异

作为 C# 新手,浏览大量使用枚举的代码库可能具有挑战性,尤其是来自强大的 Java 背景的人。本文旨在揭开 C# 和 Java 枚举之间的差异的神秘面纱,使您能够弥合差距并充分利用 C# 枚举的潜力。

主要差异

  • 简单本质C# 枚举的介绍: 与 Java 1.5 枚举不同,C# 枚举的实现无疑更加简单。它们主要用作定义一组命名常量的机制,缺乏 Java 中的高级功能。
  • 扩展方法:为了弥补功能有限,C# 引入了扩展方法,其中允许您向枚举添加自定义功能,而无需修改其底层定义。

用 C 实现著名的 Planet Enum 示例

为了说明 C# 枚举和扩展方法的实际应用,让我们深入研究 Sun 的 Java 文档中使用的标志性 Planet 枚举示例。

<code class="csharp">using System;

public enum Planet
{
    [PlanetAttr(3.303e+23, 2.4397e6)] MERCURY,
    [PlanetAttr(4.869e+24, 6.0518e6)] VENUS,
    [PlanetAttr(5.976e+24, 6.37814e6)] EARTH,
    [PlanetAttr(6.421e+23, 3.3972e6)] MARS,
    [PlanetAttr(1.9e+27, 7.1492e7)] JUPITER,
    [PlanetAttr(5.688e+26, 6.0268e7)] SATURN,
    [PlanetAttr(8.686e+25, 2.5559e7)] URANUS,
    [PlanetAttr(1.024e+26, 2.4746e7)] NEPTUNE,
    [PlanetAttr(1.27e+22, 1.137e6)] PLUTO
}

public static class Planets
{
    public static double GetSurfaceGravity(this Planet p)
    {
        return G * GetMass(p) / (GetRadius(p) * GetRadius(p));
    }

    public static double GetSurfaceWeight(this Planet p, double otherMass)
    {
        return otherMass * p.GetSurfaceGravity();
    }

    public const double G = 6.67300E-11;

    private static double GetMass(Planet p) => GetAttr(p).Mass;

    private static double GetRadius(Planet p) => GetAttr(p).Radius;

    private static PlanetAttr GetAttr(Planet p) =>
        (PlanetAttr)Attribute.GetCustomAttribute(ForValue(p), typeof(PlanetAttr));

    private static MemberInfo ForValue(Planet p) =>
        typeof(Planet).GetField(Enum.GetName(typeof(Planet), p));
}</code>

在此 C# 实现中:

  • 自定义属性用于将元数据附加到枚举成员,而不是使用如 Java 示例中所示的单独的类。
  • 扩展方法 GetSurfaceGravity 和 GetSurfaceWeight 提供与 Java 方法相同的功能,并增加了从 Planet 枚举直接访问的便利性。
  • ForValue 方法返回对应于指定枚举值的字段,通过反射启用属性检索。

通过利用 C# 的扩展方法,您可以扩展枚举的功能,以解决以前由 Java 更强大的枚举实现处理的用例。这可以实现 C# 中的平滑过渡和有效编码。

以上是C# 和 Java 枚举有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn