2010-09-14 12 views
8

1) Estoy al tanto de los siguientes beneficios:¿Beneficios de usar enumeraciones directamente usando tipos integrales?

  • que aumentan el nivel de abstracción, ya que de inmediato lo que ves valores integrales subyacentes representan.

  • Usted las puede utilizar en lugar de números mágicos y al hacer eso haciendo que el código sea más comprensible

  • También restringen los valores de una variable enum puede tener y, al hacerlo, que la aplicación sea más seguro, ya que los programadores saben qué los valores son válidos para la variable, así que supongo que tipo de proporcionar una seguridad de tipo

¿hay otros beneficios que proporcionan sobre el uso directo valores integrales?

2) ¿Por qué usan integrales como tipo subyacente y no como cadena?

agradecimiento

+1

Véase también http://stackoverflow.com/questions/672102/why-no-non-integral-enums –

+7

Un punto de nit-pick es que enum no hace nada para restringir los valores que una variable puede tener. Puede tener 'MyEnum evil = (MyEnum) 666;' y esto se compila muy bien, incluso si el valor puede no ser verdadero con cualquiera de los valores especificados en la enumeración. Los enums son una forma de ayudar a expresar el significado de valores particulares, pero no hay nada que obligue a los valores enum a ser realmente significativos. –

Respuesta

8

Has enumerado muchas de las principales razones por las que las enumeraciones son preferibles a los tipos integrales.

  • constantes con nombre son más seguro y más fácil de leer que los números mágicos

  • enumeraciones describen a los programadores para qué son. Los valores integrales no.

  • Naturalmente limitar el conjunto de valores que se pueden transmitir en. (Tienes la punta del iceberg seguridad de tipos ... pero mira más profundo ...)

También puede agregar:

  • Vastly increased Tipo Seguridad. Si acepta un 'int', entonces se puede pasar cualquier int. Si acepta un VehicleType, solo se puede pasar un VehicalType. No estoy hablando solo de alguien que pasa en 6 cuando el número permitido más grande es 5. Quiero decir, ¿qué pasa si pasas FuelType. Sin una función que crea que significa VehicleType.Aeroplane? Con enumeraciones, el compilador te dirá que eres un idiota. Un tipo integral dice "sí, 5 está bien conmigo" y su programa exhibe un comportamiento realmente extraño que puede ser extremadamente difícil de rastrear.

  • refactorización más fácil. Al igual que con las constantes mágicas, si transfiere el valor 5 en cien lugares en su programa, tendrá problemas si decide cambiar 5 para que tenga un significado diferente. Con una enumeración (siempre que no tenga problemas de compatibilidad con versiones anteriores binarias) puede cambiar los valores subyacentes. También puede cambiar el tipo subyacente de una enumeración si lo desea (byte -> int -> largo) sin tener que hacer nada más que volver a compilar el código del cliente.

  • Los campos de bits son mucho más fáciles de usar cuando se pueden nombrar los bits y las máscaras. Y si agrega nuevos bits, a menudo puede organizar las cosas de manera que la mera actualización de las máscaras relacionadas permitirá que la mayoría de su código existente maneje los nuevos campos de bits a la perfección sin tener que volver a escribirlos desde cero.

  • Coherencia a través del programa. Si tiene cuidado con la ofuscación y la seguridad de tipo, las enumeraciones le permiten representar una lista de valores con nombre que un usuario elige con los mismos nombres en el código, pero sin el costo de eficiencia del uso de cadenas.

  • Todo el mundo entiende por qué las constantes son geniales en el código. Los enum simplemente le brindan una forma de mantener un grupo de constantes relacionados. Usted podría lograr lo mismo de una manera más desordenada usando un espacio de nombres de constelaciones.

  • El uso de una enumeración para un parámetro en lugar de un bool no solo hace que el código sea autodecimal, legible y menos propenso a errores. También hace que sea mucho más fácil agregar una tercera opción cuando te das cuenta de que dos opciones no son suficientes.

Al igual que con todas las herramientas, las enumeraciones pueden ser mal utilizadas. Solo úselos donde tengan sentido.

2) ¿Por qué usar bytes o ints en lugar de cadenas? Simplemente son pequeños y eficientes.

+0

A - "... pero sin el costo de eficiencia del uso de cadenas." ¿Qué tipo de costo de eficiencia? B - De su comentario a Caspar Kleijne: "Pero tenga cuidado con el" gran inconveniente "de las variables de lectura y estáticas: el valor no puede incluirse de manera eficiente en su código de cliente; debe buscarse en su ubicación de origen repetidamente" ¿Podría elabore lo que quiere decir con los valores de las variables estáticas y de solo lectura que deben obtenerse de su ubicación fuente y cómo/por qué las enumeraciones difieren de esa manera? – user437291

+1

A: costo de eficiencia de cadenas de caracteres: usan más memoria y cuestan más tiempo de CPU para comparar/copiar que un byte o int. B: El compilador puede construir valores "const" o "enum" directamente en el código ("compare esto con el número 5"). Las variables de solo lectura/estáticas no se almacenan en el código, sino en una ubicación de datos en la memoria. Cuando el código desea usar los valores, debe leerlos desde esa ubicación ("compare este número con el valor almacenado en la ubicación de memoria X"). Leer una ubicación remota de la memoria generalmente es más costoso (más lento) que usar un valor constante (aunque puede no ser siempre el caso). –

+0

gracias a todos, adiós – user437291

1

También puede analizar una enumeración de la representación de cadena. Puede obtener esa cadena de una fuente de datos o entrada de usuario.

Creo que me vendiste en Enums en "números mágicos".

5

Supongo que requieren tipos integrales subyacentes para garantizar la simplicidad de la comparación y soportar más fácilmente indicadores de bits. Sin esa limitación, nosotros, o el compilador, o el tiempo de ejecución, probablemente tendremos que recurrir a cierta confusión para hacer cosas como combinaciones, o nos pondríamos en una situación en la que, como usted dice, no debería importar. tipo subyacente (el punto de la abstracción) y aún cuando tratamos de decir A | B obtenemos un error de tiempo de ejecución porque usamos un tipo subyacente que no es capaz de ese tipo de operación.

2

Una ventaja es cuando desea utilizar enum como indicador.

Así que si se define una enumeración de esta manera:

[Flags] 
public enum TestEnum{ A, B, C, D }; 

Entonces, si usted tiene un método que acepta una instancia de TestEnum como una variable, se pueden combinar los valores de la enumeración, para que pueda enviar a ejemplo A | B | C como parámetro para el método. Entonces, dentro del método, se puede comprobar el parámetro de la siguiente manera:

if ((paramname & TestEnum.A) > 0) 
{ 
    //do things related to A 
} 
if ((paramname & TestEnum.B) > 0) 
{ 
    //do things related to B 
} 
//same for C and D 

Además, creo que las razones que mencionas son buenos suficientes por sí mismos para usar las enumeraciones.

También con respecto al comentario de que puede forzar un valor incorrecto en una enumeración con código como este (TestEnum)500; es difícil de hacer si no desea romper su código.

El punto que el valor 0 para una enumeración debe ser el valor predeterminado, o en el caso de indicadores "la ausencia de todos los otros indicadores" es muy importante, ya que la línea TestEnum myenum instanciará myenum como 0 independientemente de si tiene definió cualquier valor enum para 0 o no.

1

El principal beneficio de enum es que se puede hacer referencia a las constantes de forma coherente, expresiva y segura. La legibilidad es, por supuesto, la principal ventaja de usar la enumeración.

Otra ventaja es que las constantes enumeradas se generan automáticamente por el compilador.
Por ejemplo, si usted tenía un tipo enumerado constante para los códigos de error que pueden ocurrir en su programa, su definición de enumeración podría ser algo como esto: enumeración Error_Code { OUT_OF_MEMORY, FILE_NOT_FOUND }; OUT_OF_MEMORY se asigna automáticamente el valor de 0 (cero) por el compilador porque aparece primero en la definición. FILE_NOT_FOUND igual a 1, etc. Si se acerca al mismo ejemplo utilizando constantes simbólicas o números mágicos, escriba mucho más código para hacer lo mismo.

Cuestiones relacionadas