Maison >développement back-end >C++ >Énumérations C# ou Java : comment ajouter des fonctionnalités aux énumérations C# comme en Java ?

Énumérations C# ou Java : comment ajouter des fonctionnalités aux énumérations C# comme en Java ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-12 07:37:43690parcourir

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

Énumérations C# et Java : analyse des différences

Pour les développeurs passant de Java à C#, il est essentiel de comprendre les différences entre les énumérations dans les deux langages. Bien que les énumérations C# semblent plus propres, elles manquent initialement de certaines fonctionnalités avancées de Java.

Principales différences

  • Paramètres du constructeur : Les énumérations Java peuvent avoir des paramètres de constructeur, permettant l'initialisation avec des données supplémentaires. Les énumérations C# n'ont pas de constructeurs.
  • Méthodes et propriétés : Les énumérations Java peuvent contenir des méthodes et des propriétés. Les énumérations C# ne peuvent pas définir directement des méthodes ou des propriétés ; elles doivent être définies en tant que méthodes d'extension.
  • Équivalent de l'annotation : En Java, vous pouvez utiliser des annotations pour associer des métadonnées à une énumération. En C#, les attributs personnalisés ont des fonctionnalités similaires.

Combler les différences

  • Méthodes d'extension : Les méthodes d'extension C# fournissent les fonctionnalités des méthodes et propriétés d'énumération Java.
  • Attributs personnalisés : Les attributs personnalisés C# peuvent être utilisés pour stocker des données supplémentaires à côté de la valeur d'énumération.

Exemple d'énumération Java Planet en C#

Le code C# suivant démontre une implémentation équivalente de l'énumération Sun's Planet, y compris les méthodes d'extension et les attributs personnalisés :

<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>

Ce code montre comment utiliser les méthodes d'extension et les attributs personnalisés pour étendre les énumérations C# avec des fonctionnalités supplémentaires, comblant ainsi efficacement le fossé avec les énumérations Java.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn