首页 >后端开发 >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