首頁 >後端開發 >C++ >C# 與 Java 枚舉:如何像在 Java 中一樣為 C# 枚舉新增功能?

C# 與 Java 枚舉:如何像在 Java 中一樣為 C# 枚舉新增功能?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-12 07:37:43690瀏覽

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