c# - tipos - ¿Cuál es el caso de uso para especificar el tipo subyacente en enumeraciones?
uso de estructuras en c# (3)
¿Cuál es el punto de tener
enum SomeEnum : byte // <----
{
SomeValue = 0x01,
...
}
cuando tienes que hacer una conversión solo para asignarla al mismo tipo de variable que las enumeraciones de tipo subyacente
byte b = (byte)SomeEnum.SomeValue;
Aparte de las razones técnicas por las que ... Aquí hay un principio de diseño.
especificar la enumeración como tener almacenamiento de bytes es un detalle de implementación. El uso de la enumeración es un problema diferente, no debe tener que saber o preocuparse por los detalles de implementación de la misma.
En el código del cliente, el hecho de que esté utilizando una enumeración debería significar que de hecho tiene la intención de usar una enumeración, no un byte, etc. largo. De lo contrario, ¿por qué no solo usa el tipo de datos que quiere decir?
El tipo de lenguaje fuerte, como C #, se esfuerza por hacer que sea un poco más difícil salir de los "contratos" de codificación, esto generalmente ayuda a que el diseño de la aplicación sea un poco mejor.
Ahora, por supuesto, no estoy diciendo que no haya ocasiones en las que deba involucrarse en los detalles de la implementación; un buen ejemplo es, por ejemplo, un mapeador relacional de objetos (ORM) en el que está asignando un tipo de datos C # a un tipo de datos de base de datos. buen ejemplo donde tienes que saber su tipo de almacenamiento para mapearlo. Pero en estos casos, es bueno tener que emitir o reflejar de manera explícita, es una buena señal en las revisiones que aquí está específicamente saliendo del uso habitual.
De enumeración (referencia de C #)
El tipo subyacente especifica la cantidad de almacenamiento que se asigna para cada enumerador. Sin embargo, se necesita una conversión explícita para convertir del tipo de enumeración a un tipo integral.
No tiene mucho sentido, en realidad, excepto que si el tipo subyacente predeterminado ( int
) no es suficiente para usted, es decir. Si desea utilizar valores enteros más altos, puede alargarlo. Esto puede ser útil cuando tiene una enumeración de [Flags]
con más de 32 valores.
Puede hacer que sea byte
o short
solo para restringir el rango de valores, pero en realidad tomará 4 bytes (es decir, igual que int
).