ホームページ >バックエンド開発 >C++ >C# と Java の列挙型: Java のような機能を C# 列挙型に追加するにはどうすればよいですか?

C# と Java の列挙型: Java のような機能を C# 列挙型に追加するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-12 07:37:43688ブラウズ

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

C# と Java の列挙型: 差異分析

Java から C# に移行する開発者にとって、2 つの言語の列挙型の違いを理解することが重要です。 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。