Imagine que he definido la siguiente enumeración:
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
¿Cuál es la mejor práctica para usar enum? Debería comenzar con 1
el ejemplo anterior o comenzar 0
(sin los valores explícitos) como este:
public enum Status : byte
{
Inactive,
Active
}
Respuestas:
Pautas de diseño del marco :
Pautas de diseño del marco / Diseño de enumeraciones de marca :
fuente
switch
declaraciones saltará a ladefault
sección, donde arrojo unInvalidEnumArgumentException
. De lo contrario, un programa puede continuar ejecutándose involuntariamente con el valor cero de una enumeración, que puede ser válida y pasar desapercibida.Bueno, supongo que estoy en desacuerdo con la mayoría de las respuestas que dicen no enumerarlas explícitamente. Siempre los enumero explícitamente, pero eso es porque en la mayoría de los casos termino persistiéndolos en un flujo de datos donde se almacenan como un valor entero. Si no agrega explícitamente los valores y luego agrega un nuevo valor, puede romper la serialización y luego no podrá cargar con precisión los objetos antiguos persistentes. Si va a hacer algún tipo de almacenamiento persistente de estos valores, le recomiendo que los configure explícitamente.
fuente
Un Enum es un tipo de valor y su valor predeterminado (por ejemplo, para un campo Enum en una clase) será 0 si no se inicializa explícitamente.
Por lo tanto, generalmente desea tener 0 como una constante definida (por ejemplo, Desconocida).
En su ejemplo, si desea
Inactive
ser el predeterminado, debería tener el valor cero. De lo contrario, es posible que desee considerar agregar una constanteUnknown
.Algunas personas han recomendado que no especifique explícitamente valores para sus constantes. Probablemente sea un buen consejo en la mayoría de los casos, pero hay algunos casos en los que querrás hacerlo:
Banderas enums
Enums cuyos valores se utilizan en interoperabilidad con sistemas externos (por ejemplo, COM).
fuente
[Flags] enum MyFlags { None = 0, A, B, Both = A | B, /* etc. */ }
es decir, es mucho más legible que[Flags] enum MyFlags { None = 0, A = 1, B = 2, Both = 3, /* etc */ }
)[Flags] enum MyFlags { None=0, A, B, C }
daría como resultado[Flags] enum MyFlags { None=0, A=1, B=2, C=3 }
, mientras que para una enumeración de Banderas normalmente querría C = 4.A menos que tenga un motivo específico para cambiarlo, deje las enumeraciones con sus valores predeterminados, que comienzan en cero.
fuente
Yo diría que la mejor práctica es no numerarlos y dejar que sea implícito, lo que comenzaría desde 0. Dado que es implícito, es la preferencia de idioma que siempre es bueno seguir :)
fuente
Comenzaría una enumeración de tipo booleano con un 0.
A menos que "Inative" signifique algo diferente a "Inactive" :)
Esto conserva el estándar para aquellos.
fuente
Yo diría que depende de cómo los uses. Para marcar enum es una buena práctica tener 0 para el
None
valor, así:Cuando es probable que su enumeración se asigne a una tabla de búsqueda de base de datos, comenzaría con 1. No debería importar mucho el código escrito profesionalmente, pero esto mejora la legibilidad.
En otros casos, lo dejaría como está, sin importar si comienzan con 0 o 1.
fuente
A menos que tenga una buena razón para usar los valores sin procesar, solo debe usar valores implícitos y hacer referencia a ellos con
Status.Active
yStatus.Inactive
.El problema es que es posible que desee almacenar datos en un archivo plano o base de datos, o utilizar un archivo plano o base de datos que otra persona creó. Si lo está haciendo usted mismo, hágalo de manera que la numeración se ajuste para lo que se usa el Enum.
Si los datos no son suyos, por supuesto, querrá usar lo que el desarrollador original haya usado como esquema de numeración.
Si planea usar Enum como un conjunto de indicadores, hay una convención simple que vale la pena seguir:
Los valores deben ser potencias de dos y pueden expresarse mediante operaciones de desplazamiento de bits.
None
, obviamente debería ser0
, peroAll
es menos obvio-1
.~0
es la negación binaria de0
y da como resultado un número que tiene cada bit establecido en1
, que representa un valor de-1
. Para las banderas compuestas (a menudo utilizadas por conveniencia), se pueden fusionar otros valores usando el operador o el bit|
.fuente
No asignes ningún número. Solo úsalo como se supone que debe usarse.
fuente
Si no se especifica, la numeración comienza en 0.
Es importante ser explícito ya que las enumeraciones a menudo se serializan y almacenan como int, no como una cadena.
Para cualquier enumeración almacenada en la base de datos, siempre enumeramos explícitamente las opciones para evitar cambios y reasignaciones durante el mantenimiento.
Según Microsoft, la convención recomendada es usar la primera opción cero para representar un valor predeterminado no inicializado o el más común.
A continuación se muestra un acceso directo para comenzar a numerar en 1 en lugar de 0.
Si desea establecer valores de indicador para utilizar operadores de bits en valores de enumeración, no comience la numeración en el valor cero.
fuente
Si comienza en 1, puede obtener fácilmente un recuento de sus cosas.
Si comienza en 0, utilice el primero como valor para cosas no inicializadas.
fuente
En primer lugar, a menos que esté especificando valores específicos por una razón (el valor numérico tiene significado en otro lugar, es decir, la base de datos o el servicio externo), no especifique valores numéricos en absoluto y deje que sean explícitos.
En segundo lugar, siempre debe tener un elemento de valor cero (en enumeraciones sin marcas). Ese elemento se usará como el valor predeterminado.
fuente
No los comience en 0 a menos que haya una razón para hacerlo, como usarlos como índices para una matriz o lista, o si hay alguna otra razón práctica (como usarlos en operaciones bit a bit).
Su
enum
debe comenzar exactamente donde se necesita. No tiene por qué ser secuencial tampoco. Los valores, si se establecen explícitamente, deben reflejar algún significado semántico o consideración práctica. Por ejemplo, unaenum
de las "botellas en la pared" debe numerarse del 1 al 99, mientras que unaenum
potencia de 4 probablemente debe comenzar en 4 y continuar con 16, 64, 256, etc.Además, solo se debe agregar un elemento de valor cero
enum
si representa un estado válido. A veces, "ninguno", "desconocido", "perdido", etc., son valores válidos, pero muchas veces no lo son.fuente
Me gusta comenzar mis enumeraciones en 0, ya que ese es el valor predeterminado, pero también me gusta incluir un valor Desconocido, con un valor de -1. Esto se convierte en el valor predeterminado y puede ayudar con la depuración a veces.
fuente