[C#] enum et struct

enum et struct [C#] - C#/.NET managed - Programmation

Marsh Posté le 21-02-2011 à 10:52:32    

Bonjour,
 
j'ai une question technique.
 
J'avais d'abord déclarer dans mon code un enum

Code :
  1. public enum Block
  2. {
  3.      Un = 1,
  4.      Deux = 2,
  5.      Trois = 3,
  6.      Quatre = 4
  7. }


Et je me suis rendu compte en le faisant que il me fallait afficher ces valeurs, et les afficher pas n'importe comment. je souhaite faire un tableau de valeur statique qui comprendrai pour chaque entrée une paire de valeur.. la valeur utile et la valeur affichable IE:

Code :
  1. public struct Pair
  2.     {
  3.         int Value;
  4.         string Name;
  5.     }
  6. Un = {1, "Un"},
  7. Deux = {2, "Deux"},
  8. Trois = {3, "Trois"},
  9. Quatre = {4, "Quatre"}


 
le problème, c'est que j'arrive pas a faire un enum de ce bordel :p
 
les valeurs n'ont pas vocations à être modifiées en Runtime
 
J'aurais souhaité y accéder facilement
Block.Un.Value
Console.WriteLine("La valeur est "+Block.Un.Name);
 
j'ai essayer de remplir mon enum avec des Pair, mais je ne peux pas les utiliser (normal, il ne sais pas quel est le type à l'intérieur de l'enum...)
 

Code :
  1. public struct MA_Pair
  2.     {
  3.         string Name;
  4.         int Value;
  5.         public MA_Pair(int value, string name)
  6.         {
  7.             Value = value;
  8.             Name = name;
  9.         }
  10.     }
  11.     public enum MA_Block
  12.     {
  13.         Air = new MA_Pair(0x00, "Air" )
  14.     }


 
     
invalid:
MA_Block.Air.Value
 
 
Je pourrais tout mettre dans une classe, mais ca m'obligerai à l'instancier, et puis elle serait pas visible partout a moins de faire une variable globale moche. Je préférerais que ca soit accessible dans le namespace sans avoir a me soucier de l'instanciation.
 
je pourrais aussi faire un double tableau type
 
 

Code :
  1. public enum MA_Block
  2.     { Air=0, Stone, Grass, Dirt }
  3. private MA_Pair[] BlockList = new MA_Pair[4];
  4. BlockList[MA_Block.Air] = new MA_Pair(0x01, "Air" );
  5. BlockList[MA_Block.Stone] = new MA_Pair(0x02, "Stone" );
  6. BlockList[MA_Block.Grass] = new MA_Pair(0x03, "Grass" );
  7. BlockList[MA_Block.Dirt ] = new MA_Pair(0x04, "Dirt " );


 
 
Ca oblige a faire 2 déclaration distincte, et surtout à maintenir les 2! si jamais je veux me débarraser d'une valeur au milieu, bonjour la galère :p
 
pour y acceder de la sorte:

Code :
  1. BlockList[MA_Block.Air].Value
  2. BlockList[MA_Block.Stone].Name


Mais c'est pas très sympa comme accesseur.
de plus, pour ma map après, ca devient super illisible
 

Code :
  1. private MA_Pair[,,] Map = new MA_Pair[_width, _height, _depth];
  2.             for (int i = 0; i < _width; i++)
  3.                 for (int j = 0; j < _depth; j++)
  4.                     for (int k = 0; k < _height; k++)
  5.                         Map [i, j, k] = BlockList[MA_Block.Air];


 
ca devient compliquer là :p
 
bref, j'ai ptet pas la meilleure solution en tete... quelqu'un aurait une idée?
 

Reply

Marsh Posté le 21-02-2011 à 10:52:32   

Reply

Marsh Posté le 21-02-2011 à 13:37:54    

Citation :

Chaque type d'énumération a un type sous-jacent qui peut être n'importe quel type intégral sauf char. Le type sous-jacent par défaut des éléments de l'énumération est int. Pour déclarer un enum d'un autre type intégral, tel que octet, utilisez les deux-points après l'identificateur suivi par le type :
 
Les types approuvés pour un enum sont byte, sbyte, short, ushort, int, uint, long ou ulong.

Tu ne peux donc déclarer un énum dont les éléments sont des structs.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed