2009-11-25 4 views
1

Comment fonctionne enum dans .NET? par ex.comment enum est utilisé dans .NET

Enum eOpenMode 
    Add = 1 
    Edit = 2 
End Enum 

If LOpenMode = eOpenMode.Add Then 
    rdoAddProject.Checked = True 
ElseIf LOpenMode = eOpenMode.Edit Then 
    rdoEditProject.Checked = True 

Comment cela se compare par leur valeur (1,2) ou par son nom (ajouter, modifier) ​​et quel sera schéma d'allocation de mémoire?

Répondre

6

Par défaut, les énumérations sont basées sur le type Int32 (bien qu'elles puissent être utilisées avec d'autres types numériques primitifs), de sorte que les comparaisons sont effectuées sur les valeurs entières.

En ce qui concerne la représentation en mémoire de la valeur, elle doit être identique à une valeur Int32 standard.

+1

Chaque fois que je pense à propos des types de valeur .NET, j'ai toujours finissent par me confondre pendant quelques minutes en pensant aux vtables et au casting. Espérons que j'ai bien compris ... – LorenVS

4

Les entiers ne sont en réalité que des entiers - (typiquement int) - et sont comparés exactement comme tels. Si vous avez:

enum Mwahaha { 
    Evil = 1, Nasty = 1 
} 

Alors vous allez constater que Mwahaha.Evil == Mwahaha.Nasty. Les temps que les noms importants sont:

  • dans votre code
  • lors de l'utilisation Enum.Parse (etc)
  • lors de l'affichage via ToString() etc (je pense qu'il est indéfini si Evil ou Nasty est affiché ci-dessus)
  • lors de l'utilisation des choses comme la sérialisation XML (similaire au précédent)
+0

Ummm ... La valeur intégrale de Mwahaha.Evil est 1, de même que la valeur de Mwahaha.Nasty est 2, alors comment peuvent-ils être égaux ou faites-vous référence à l'objet type de l'enum? – t0mm13b

+0

Parce que mes doigts sont bien entraînés et refusent de faire des bêtises! Je les ai rejetés maintenant, merci. –

+0

Belle énumération par le chemin qui m'a fait sourire! :) – t0mm13b

1

en C#, vous utilisez un ENUM pour deux raisons:

  1. Pour limiter l'ensemble des valeurs disponibles
  2. Pour donner des noms utiles à ces valeurs

Si vous ne deviez satisfaire une partie (2), vous pouvez simplement utiliser des constantes. Le type de stockage pour une énumération est, par défaut, Int32. Cela signifie que l'opérateur == compare les entiers. Vous pouvez contrôler le type de base pour une énumération en spécifiant explicitement le type de base (par exemple Int64 ou octet).

+0

C# ne * contraint pas vraiment * les valeurs - il offre de large guidage, mais vous pouvez assigner n'importe quelle valeur (entier de taille correcte) que vous aimez vraiment. –

+0

Vous pouvez remplacer le type pour enum, tel que enum: byte {...} ou, enum: short {...} etc. – t0mm13b

3

Les énumérations sont essentiellement une couche mince sur un type numérique primitif (par défaut Int32). En interne, ils sont manipulés exactement comme des valeurs numériques et ils peuvent être moulés vers et depuis leur type sous-jacent facilement. Pour cette raison, il est important de noter que lorsque vous traitez avec Enums, vous devez faire attention à la gestion des valeurs qui vous sont transmises.

Enum eOpenMode 
    Add = 1 
    Edit = 2 
End Enum 

Dim myEnumVal as eOpenMode 
myEnumVal = Cast(100, eOpenMode) 

Ce code compile et fonctionne très bien et myEnumVal contiendra une valeur de 100, qui ne sont pas mis en correspondance avec une valeur énumérée connue. Il serait alors légal pour moi de passer cette valeur à une méthode qui attend un argument eOpenMode, même si ce n'est pas l'une des valeurs énumérées.

Assurez-vous de vérifier les valeurs enum à l'aide des instructions Switch et de lancer ArgumentOutOfRangeException si la valeur fournie n'est pas définie dans l'énumération.

En plus de cela, parce que les énumérations sont soutenus par les types numériques, ils peuvent également être utilisés comme masques-bit pour permettre une combinaison de valeurs:

<Flags> 
Enum eOpenMode 
    Add = 1 
    Edit = 2 
    AddEdit = Add OR Edit 
End Enum 
+0

bonne réponse, merci. Chaque réponse a quelque chose de différent. –

Questions connexes