首頁 >後端開發 >C++ >C# 與 Java 枚舉:主要差異是什麼以及如何有效地從 Java 遷移到 C#?

C# 與 Java 枚舉:主要差異是什麼以及如何有效地從 Java 遷移到 C#?

DDD
DDD原創
2025-01-12 10:11:46640瀏覽

C# vs. Java Enums: What are the Key Differences and How Can I Effectively Migrate from Java to C#?

C# 與 Java 枚舉:為 C# 新手澄清差異

從 Java 遷移到 C# 時,您可能會注意到枚舉實現上的差異。雖然 C# 枚舉乍看之下可能更簡單,但理解它們的差異對於有效利用其功能至關重要。

C# 和 Java 枚舉之間的區別

  • 型別安全:Java 枚舉透過自動建立子類別並強制獨佔性來提供更嚴格的型別安全性。另一方面,C# 枚舉是值類型,允許隱式轉換,這可能會導致運行時錯誤。
  • 功能限制:Java 枚舉提供內建方法,例如 valueOf、name 和 ordinal。 C# 枚舉缺乏這些方法,但允許自訂擴充方法來增強其功能。
  • 儲存:Java 枚舉將枚舉值儲存為堆疊上的物件。 C# 枚舉將值儲存為堆疊上的整數,提供更快的存取速度和更小的記憶體佔用。
  • 屬性:Java 枚舉可以具有儲存在 EnumConstants 中的關聯數據,但它們是靜態且不可變的。 C# 枚舉支援自訂屬性,可讓您動態新增其他資訊。

克服差異

為了彌合 Java 和 C# 枚舉之間的差距,請考慮以下方法:

  • 使用擴充方法:C# 枚舉可讓您定義擴充方法,以複製 Java 枚舉方法的功能。這提供了一種方便的方法來存取常見操作,而無需修改核心枚舉定義。
  • 利用自訂屬性:C# 允許您定義自訂屬性,可用於將附加資料與枚舉值關聯。這種方法提供了一種靈活的方式來儲存和存取枚舉上的擴充屬性。

C# 中行星範例的等效實作

為了模擬 Java 中 Planet 枚舉的功能,您可以在 C# 中實作自訂屬性和擴充方法,如下所示:

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

namespace Planets
{
    [AttributeUsage(AttributeTargets.Field)]
    public class PlanetAttribute : Attribute
    {
        public double Mass { get; set; }
        public double Radius { get; set; }
    }

    public enum Planet
    {
        [PlanetAttribute(3.303e+23, 2.4397e6)]
        Mercury,
        [PlanetAttribute(4.869e+24, 6.0518e6)]
        Venus,
        [PlanetAttribute(5.976e+24, 6.37814e6)]
        Earth,
        [PlanetAttribute(6.421e+23, 3.3972e6)]
        Mars,
        [PlanetAttribute(1.9e+27, 7.1492e7)]
        Jupiter,
        [PlanetAttribute(5.688e+26, 6.0268e7)]
        Saturn,
        [PlanetAttribute(8.686e+25, 2.5559e7)]
        Uranus,
        [PlanetAttribute(1.024e+26, 2.4746e7)]
        Neptune,
        [PlanetAttribute(1.27e+22, 1.137e6)]
        Pluto
    }

    public static class PlanetExtensions
    {
        public static double SurfaceGravity(this Planet planet)
        {
            PlanetAttribute attribute = GetAttribute<PlanetAttribute>(planet);
            return GetG() * attribute.Mass / (attribute.Radius * attribute.Radius);
        }

        public static double SurfaceWeight(this Planet planet, double mass)
        {
            return mass * planet.SurfaceGravity();
        }

        private static double GetG() => 6.67300E-11;

        private static T GetAttribute<T>(Planet planet) where T : Attribute
        {
            FieldInfo fieldInfo = typeof(Planet).GetField(planet.ToString());
            return fieldInfo.GetCustomAttribute<T>();
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            double earthWeight = 175;
            double mass = earthWeight / Planet.Earth.SurfaceGravity();
            Console.WriteLine($"Weight on each planet (mass = {mass}):");
            foreach (Planet planet in Enum.GetValues<Planet>())
            {
                Console.WriteLine($"{planet}: {planet.SurfaceWeight(mass)}");
            }
        }
    }
}</code>

此更新後的範例示範如何使用自訂屬性來儲存行星數據,以及如何使用擴充方法來實作 SurfaceGravity() 和 SurfaceWeight() 功能,從而提供 Java Planet 枚舉的 C# 等效項。

以上是C# 與 Java 枚舉:主要差異是什麼以及如何有效地從 Java 遷移到 C#?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn