ホームページ > バックエンド開発 > C++ > C# と Java 列挙型: 主な違いは何ですか? Java から C# に効果的に移行するにはどうすればよいですか?

C# と Java 列挙型: 主な違いは何ですか? Java から C# に効果的に移行するにはどうすればよいですか?

DDD
リリース: 2025-01-12 10:11:46
オリジナル
673 人が閲覧しました

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート