首页 >后端开发 >C++ >C# 与 Java 枚举:如何像在 Java 中一样向 C# 枚举添加功能?

C# 与 Java 枚举:如何像在 Java 中一样向 C# 枚举添加功能?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-12 07:37:43726浏览

C# vs. Java Enums: How Do I Add Functionality to C# Enums Like in Java?

C# 和 Java 枚举:差异解析

对于从 Java 转向 C# 的开发者来说,理解两种语言枚举之间的差异至关重要。虽然 C# 枚举看起来更简洁,但它最初缺乏 Java 的一些高级特性。

主要差异

  • 构造函数参数: Java 枚举可以拥有构造函数参数,允许使用附加数据进行初始化。而 C# 枚举没有构造函数。
  • 方法和属性: Java 枚举可以包含方法和属性。C# 枚举不能直接定义方法或属性;而必须定义为扩展方法。
  • 注解等效项: 在 Java 中,可以使用注解将元数据与枚举关联。在 C# 中,自定义特性具有类似的功能。

弥合差异

  • 扩展方法: C# 扩展方法可以提供 Java 枚举方法和属性的功能。
  • 自定义特性: C# 自定义特性可以用来存储枚举值旁边的附加数据。

C# 中的 Java Planet 枚举示例

以下 C# 代码演示了 Sun 的 Planet 枚举的等效实现,包括扩展方法和自定义特性:

<code class="language-csharp">using System;
using System.Reflection;

namespace PlanetEnum
{
    public static class Planets
    {
        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();
        }

        public const double G = 6.67300E-11;

        private static PlanetAttr GetAttr(Planet p)
        {
            return (PlanetAttr)Attribute.GetCustomAttribute(ForValue(p), typeof(PlanetAttr));
        }

        private static MemberInfo ForValue(Planet p)
        {
            return typeof(Planet).GetField(Enum.GetName(typeof(Planet), p));
        }
    }

    [AttributeUsage(AttributeTargets.Field)]
    public class PlanetAttr : Attribute
    {
        public PlanetAttr(double mass, double radius)
        {
            Mass = mass;
            Radius = radius;
        }

        public double Mass { get; private set; }
        public double Radius { get; private set; }
    }

    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
    }
}</code>

这段代码演示了如何使用扩展方法和自定义特性来扩展 C# 枚举的附加功能,有效地弥合了与 Java 枚举的差距。

以上是C# 与 Java 枚举:如何像在 Java 中一样向 C# 枚举添加功能?的详细内容。更多信息请关注PHP中文网其他相关文章!

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