2010-02-25 5 views
6

Ma question est assez simple, mais je n'ai pas trouvé le moyen de mettre en œuvre mon code comme je le souhaite. J'ai donc commencé à me demander si le code que je veux implémenter n'est pas bon. Et si c'est le cas, quelle est la meilleure façon de le faire.Utiliser enum comme constante entière en C#

Ici, il va:

class InputManager 
{ 
    SortedDictionary<ushort,Keys> inputList = new SortedDictionary<ushort,Keys>(); 

    public void Add(ushort id, Keys key) {...} 
    public bool IsPressed(ushort id) {...} 
} 

class Main 
{ 
    private enum RegisteredInput : ushort 
    { 
     Up, 
     Down, 
     Confirm 
    } 

    public Main() 
    { 
      InputManager manager = new InputManager(); 

      manager.Add(RegisteredInput.Up, Keys.Q); 
      manager.Add(RegisteredInput.Down, Keys.A); 
      manager.Add(RegisteredInput.Confirm, Keys.Enter); 
    } 

    void update() 
    { 
    if(manager.IsPressed(RegisteredInput.Up)) action(); 
    } 
} 

Ce code ne compilera pas, donnant des erreurs de ce genre:

La méthode la plus surchargée de match pour 'InputManager.Add (ushort, Keys)' a quelques arguments non valides
argument '1': ne peut pas convertir 'RegisteredInput' à 'ushort'

Si j'utilise un jeter comme dans manager.Add((ushort)RegisteredInput.Up, Keys.Q); ça va fonctionner. Mais parce que la distribution doit être explicite, je me demandais si ce code n'est pas recommandé en C# comme en C++ et s'il y a une meilleure façon de le faire (comme utiliser const ushort pour chaque valeur, ce que je n'aime pas beaucoup).

La meilleure réponse que j'ai obtenue jusqu'ici était de this thread, mais ça ressemble tellement à un hack, je me suis inquiété.

Merci!

+5

Pourquoi le dictionnaire n'est-il pas défini comme "Dictionary '? En outre, essayez d'éviter de retaper les messages d'erreur et le code dans les sites Web lorsque vous posez des questions sur les choses, la chance que vous faites quelque chose de mal, nous allons raccrocher sur est là. Comme ... le message d'exception nommait-il réellement la méthode "Addd" avec 3 d's? Comment pouvons-nous vous faire confiance pour réellement copier le code réel utilisé, et ne pas retaper quelque chose de simplifié qui a d'autres problèmes tout à fait? –

+0

Parce que je ne veux pas de touches répétées. A propos du message d'erreur, je n'ai pas retapé, j'ai juste supprimé beaucoup d'espaces de noms non pertinents. J'ai également changé les vrais noms des méthodes, car ils ne sont pas en anglais. –

+0

Je ne comprends pas ce que vous entendez par "touches répétées". Peux-tu élaborer? –

Répondre

7

Attribuez un type générique à InputManager. IE:

class InputManager<T> 
{ 
    SortedDictionary<T,Keys> inputList = new SortedDictionary<T,Keys>(); 

    public void add(T id, Keys key) {...} 
    public bool isPressed(T id) {...}  
} 
+0

Nice! Tellement simple, mais cela ne m'est pas venu à l'esprit. Je pense que je vais aller avec cette solution. Merci! –

5

Le casting implicite est nécessaire pour Enums Je recommande ceci:

public static class RegisteredInput { 
    public const ushort Up = 0; 
    public const ushort Down = 1; 
    public const ushort Confirm = 2; 
} 
+0

Eh bien alors ... battre mon temps d'une minute! Idem, évidemment! – Pwninstein

+0

Mais pensez-vous réellement que c'est une meilleure façon d'écrire ce code, C# -wise? Je n'aime pas le fait que je dois simuler le fonctionnement de base d'une énumération qui donne automatiquement des valeurs aux énumérations. –

+0

Un grand nombre de problèmes techniques que j'ai rencontrés dans le passé m'ont éloigné d'Enums récemment.J'utilise cette pratique pour toutes mes constantes, qu'elles soient ints, cordes, dates, etc. C'est un peu plus de travail qu'un Enum, mais pas de beaucoup. –

7

Pourquoi ne pas définir simplement le dictionnaire en utilisant votre énumération? Y at-il une raison pour laquelle il doit être un int?

public void add(RegisteredInput id, Keys key) {...} 

aussi, en aparté, il est généralement recommandé que les membres publics acessible (méthodes, types, etc.) doivent être pascals tubé (en d'autres termes, au lieu de Addadd).

+0

A propos du boîtier pascal, il est dans l'original. Je vais le corriger ici aussi. Pardon! Je ne veux pas utiliser l'enum comme clé directement pour éviter le couplage. –