2010-02-25 13 views
6

Mi pregunta es bastante simple, pero no encontré la manera de implementar mi código como quiero. Entonces comencé a preguntarme si el código que deseo implementar no es bueno. Y si lo es, ¿cuál es la mejor manera de hacerlo?Usar enum como constante entera en C#

Aquí 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(); 
    } 
} 

Este código no se compilará, produce errores de este tipo:

El partido mejor método sobrecargado para 'InputManager.Add (ushort, Keys) tiene algunos argumentos no válidos
argumento '1': no ​​se puede convertir de 'RegisteredInput' a 'ushort'

Si utilizo una lanzar como en manager.Add((ushort)RegisteredInput.Up, Keys.Q);, funcionará. Pero debido a que el elenco debe ser explícito, me preguntaba si no es código recomendado en C# como en C++ y si hay una mejor manera de hacerlo (como usar const ushort para cada valor, que no me gusta mucho)

La mejor respuesta que obtuve hasta ahora fue this thread, pero suena como un truco, me preocupaba.

Gracias!

+5

¿Por qué el diccionario no se define como 'Dictionary '? Además, trate de evitar volver a escribir los mensajes de error y el código en los sitios web cuando pregunte por cosas, existe la posibilidad de que haga algo mal que nos colgará. Como ... ¿el mensaje de excepción realmente nombró el método "Addd" con 3 d's? ¿Cómo podemos confiar en que realmente copie el código real utilizado, y no vuelva a escribir algo simplificado que tenga otros problemas en total? –

+0

Porque no quiero llaves repetidas. Sobre el mensaje de error, no volví a escribir, simplemente eliminé gran parte del espacio de nombres irrelevante. También cambié los nombres reales de los métodos, porque no están en inglés. –

+0

No entiendo lo que quiere decir con "teclas repetidas". ¿Puedes elaborar? –

Respuesta

7

Haga de InputManager un tipo genérico. 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

¡Agradable! Tan simple, sin embargo, no vino a mi mente. Creo que iré con esta solución. ¡Gracias! –

5

La conversión implícita es necesaria para enumeraciones recomiendo esto:

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

Bueno, entonces ... vencer a mi por un minuto! Ídem, obviamente! – Pwninstein

+0

¿Pero de verdad crees que esta es una mejor forma de escribir este código, C# -wise? No me gusta el hecho de que tengo que simular el funcionamiento básico de una enumeración que está dando valores a enumeraciones automáticamente. –

+0

Muchos problemas técnicos con los que me he encontrado en el pasado me han apartado de Enume recientemente.Utilizo esta práctica para todas mis constantes, ya sean enteros, cadenas, fechas, etc. Es un poco más de trabajo que un Enum, pero no mucho. –

7

Por qué no sólo definir el diccionario de la utilización de su enumeración? ¿Hay alguna razón por la cual necesita ser un int?

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

También, como un aparte, generalmente se recomienda que los miembros del público-acessible (métodos, tipos, etc.) deben ser entubado Pascal (en otras palabras, en lugar de Addadd).

+0

Acerca del pascal en caja, está en el original. Lo corregiré aquí también. ¡Lo siento! No quiero utilizar la clave enum directamente para evitar el acoplamiento. –

Cuestiones relacionadas