Maison développement back-end C++ Les énumérations en C# peuvent-elles contenir plusieurs valeurs avec la même constante sous-jacente, et quelles sont les implications ?

Les énumérations en C# peuvent-elles contenir plusieurs valeurs avec la même constante sous-jacente, et quelles sont les implications ?

Jan 03, 2025 am 02:12 AM

Can Enums in C# Hold Multiple Values with the Same Underlying Constant, and What are the Implications?

Valeurs multiples dans les déclarations d'énumération : une plongée plus approfondie dans le CLR

Contrairement aux structures, les énumérations sont classées comme des types de valeurs légers qui représentent un ensemble de constantes nommées. Cependant, la question présente une observation intrigante selon laquelle les énumérations peuvent apparemment permettre d'attribuer plusieurs valeurs à la même constante.

En fouillant dans les détails d'implémentation du Common Language Runtime (CLR), il devient clair que les énumérations sont fondamentalement similaires aux structures. En arrière-plan, les énumérations dérivent de la classe de base System.Enum et sont essentiellement des structures avec des valeurs constantes prédéfinies.

Considérez l'exemple de déclaration d'énumération :

public enum Color
{
    Red = 1,
    Blue = 1,
    Green = 1
}

CLR interprète en interne cette déclaration comme suit :

public struct Color : System.Enum
{
    public const int Red = 1;
    public const int Blue = 1;
    public const int Green = 1;
}

Bien que C# interdise la déclaration explicite de classe de base pour les structures, le CLR génère néanmoins cette représentation pour les énumérations.

La présence de plusieurs constantes de même valeur dans un type enum ne pose pas de problème. Cependant, cette attribution de valeur non unique peut entraîner un comportement inattendu lors de la conversion vers le type enum.

Par exemple :

Color color1 = (Color)1;
Color color2 = (Color)Enum.Parse(typeof(Color), "1");

color1 et color2 seront définis sur la valeur Rouge car la première attribution de valeur est arbitraire. Techniquement, ni color1 ni color2 ne se voient attribuer du rouge ; ils contiennent plutôt la valeur 1. Mais lorsqu'ils sont affichés, c'est le rouge que vous verrez.

De plus, les opérations de comparaison entre des valeurs d'énumération non uniques peuvent donner des résultats surprenants :

// true (Red is Green??)
bool b = Color.Red == Color.Green;

Cette égalité est vraie car la valeur numérique sous-jacente du rouge et du vert est 1.

Bien que ce comportement ne soit pas problématique en soi, il mérite d'être pris en considération lors de l'utilisation d'énumérations. avec des valeurs non uniques. Il est essentiel de déterminer si ce caractère non-unique correspond à l'objectif visé et à la sémantique de la conception de votre énumération.

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 de ce site Web
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

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Rimworld Odyssey Comment pêcher
1 Il y a quelques mois By Jack chen
Puis-je avoir deux comptes Alipay?
1 Il y a quelques mois By 下次还敢
Guide du débutant de Rimworld: Odyssey
1 Il y a quelques mois By Jack chen
Porce de variable PHP expliquée
3 Il y a quelques semaines By 百草

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1506
276
Utilisation de STD :: Chrono en C Utilisation de STD :: Chrono en C Jul 15, 2025 am 01:30 AM

STD :: Chrono est utilisé en C pour traiter le temps, y compris l'obtention de l'heure actuelle, la mesure du temps d'exécution, le point de fonctionnement et la durée de l'opération et le temps d'analyse de formatage. 1. Utilisez STD :: Chrono :: System_clock :: Now () pour obtenir l'heure actuelle, qui peut être convertie en une chaîne lisible, mais l'horloge système peut ne pas être monotone; 2. Utilisez STD :: Chrono :: standard_clock pour mesurer le temps d'exécution pour assurer la monotonie, et la convertir en millisecondes, secondes et autres unités via durée_cast; 3. Point de temps (temps_point) et durée (durée) peut être interopérable, mais l'attention doit être accordée à la compatibilité des unités et à l'époque de l'horloge (époque)

Comment générer un UUID / GUID en C? Comment générer un UUID / GUID en C? Jul 13, 2025 am 02:35 AM

Il existe trois moyens efficaces de générer des UUID ou des guides en C: 1. Utilisez la bibliothèque Boost, qui fournit une prise en charge multi-version et est simple à interface; 2. Générer manuellement la version4uuides adaptée aux besoins simples; 3. Utilisez des API spécifiques à la plate-forme (telles que Windows 'CoCreateGuid), sans dépendances tierces. Boost convient à la plupart des projets modernes, la mise en œuvre manuelle convient aux scénarios légers et API Platform convient aux environnements d'entreprise.

Qu'est-ce que l'alignement de la mémoire et pourquoi est-il important en C? Qu'est-ce que l'alignement de la mémoire et pourquoi est-il important en C? Jul 13, 2025 am 01:01 AM

MemoryAlignmentInc réfèrent la mise en œuvre de la dataaTSpecificMmemoryAdressesthétiquera-sultiplesofAVALUe, généralement de la manière

C Techniques d'initialisation C Techniques d'initialisation Jul 18, 2025 am 04:13 AM

Il existe de nombreuses méthodes d'initialisation en C, qui conviennent à différents scénarios. 1. L'initialisation de la variable de base inclut l'initialisation de l'attribution (inta = 5;), l'initialisation de construction (inta (5);) et l'initialisation de la liste (inta {5};), où l'initialisation de la liste est plus stricte et recommandée; 2. C 11 prend également en charge l'initialisation directe au sein de la classe; 3. L'initialisation du tableau et du conteneur peut être utilisée en mode traditionnel ou C 11 de C 11 :: Array et STD :: Vector, prise en charge la liste d'initialisation et améliorer la sécurité; 4. Initialisation par défaut

Objet tranchant en c Objet tranchant en c Jul 17, 2025 am 02:19 AM

L'objet Slice fait référence au phénomène selon lequel une partie des données de classe de base est copiée lors de l'attribution ou du passage d'un objet de classe dérivé à un objet de classe de base, entraînant la perte de nouveaux membres de la classe dérivée. 1. Les tranches d'objet se produisent dans des conteneurs qui attribuent directement des valeurs, passent les paramètres par valeur ou stockent des objets polymorphes dans les classes de base de stockage; 2. Les conséquences incluent la perte de données, le comportement anormal et difficile à déboguer; 3. Éviter les méthodes incluent le passage d'objets polymorphes à l'aide de pointeurs ou de références, ou à utiliser des pointeurs intelligents pour gérer le cycle de vie de l'objet.

Utilisation de STD :: Facultatif en C Utilisation de STD :: Facultatif en C Jul 21, 2025 am 01:52 AM

Pour déterminer si STD :: Facultatif a une valeur, vous pouvez utiliser la méthode has_value () ou juger directement dans l'instruction if; Lors du retour d'un résultat qui peut être vide, il est recommandé d'utiliser STD :: Facultatif pour éviter les pointeurs et exceptions nuls; Il ne doit pas être abusé, et les valeurs de retour booléen ou les variables de bool indépendantes conviennent plus à certains scénarios; Les méthodes d'initialisation sont diverses, mais vous devez faire attention à l'utilisation de réinitialisation () pour effacer la valeur et faire attention au cycle de vie et au comportement de construction.

Expliquez Raii en C Expliquez Raii en C Jul 22, 2025 am 03:27 AM

RAII est une technologie importante utilisée dans la gestion des ressources dans C. son cœur réside dans la gestion automatique des ressources tout au long du cycle de vie de l'objet. Son idée principale est: les ressources sont acquises au moment de la construction et libérées à la destruction, évitant ainsi les problèmes de fuite causés par la libération manuelle. Par exemple, lorsqu'il n'y a pas de RAII, l'opération de fichier nécessite un appel manuellement à l'appel. S'il y a une erreur au milieu ou un retour à l'avance, vous pouvez oublier de fermer le fichier; Et après avoir utilisé RAII, comme la classe FileHandle résume l'opération de fichier, le destructeur sera automatiquement appelé après avoir quitté la portée pour libérer la ressource. 1.RAII est utilisé dans la gestion des verrouillage (comme STD :: Lock_Guard), 2. Management de la mémoire (comme STD :: UNIQUE_PTR), 3. Base de données et gestion de la connexion réseau, etc.

C vecteur obtenir le premier élément C vecteur obtenir le premier élément Jul 25, 2025 am 12:35 AM

Il existe quatre méthodes courantes pour obtenir le premier élément de STD :: Vector: 1. Utilisez la méthode avant () pour vous assurer que le vecteur n'est pas vide, a une sémantique claire et est recommandé pour une utilisation quotidienne; 2. Utilisez l'indice [0], et il doit également être jugé vide, avec les performances comparables à la sémantique avant () mais légèrement plus faible; 3. Utiliser * begin (), qui convient à la programmation générique et aux algorithmes STL; 4. Utiliser à (0), sans jugement nul manuellement, mais à faible performance, et lancer des exceptions lors du passage de la frontière, ce qui convient au débogage ou à la manipulation des exceptions; La meilleure pratique consiste à appeler d'abord vide () pour vérifier s'il est vide, puis utiliser la méthode avant () pour obtenir le premier élément pour éviter un comportement non défini.

See all articles