c# - tipo - Valores enum no únicos
recorrer enum c# (6)
El mismo valor numérico pero diferente nombre no es más que un alias. Podría ser, por ejemplo
public enum Color
{
DefaultColor = 1,
Red = 1,
Blue = 2
}
Puede tener sentido en algunos casos, pero no en muchos. Cuando vuelva a analizar los valores y llame a colorValue.ToString () obtendrá el último valor como valor de la cadena de nuevo (Rojo en este caso), pero perderá el cono de colores predeterminados, ya que es la misma cosa. Al menos en la forma en que modeló sus datos. Si desea mantenerlo separado, use diferentes valores para diferentes cosas.
Estoy tratando de ocultar las posiciones de índice en un archivo edi ... Tuve una situación en la que 2 o 3 cosas podrían estar en un índice basado en la situación. Sería genial usar una enumeración para ocultar los "números mágicos" y me sorprendió ver que puedes asignar varias enumeraciones al mismo valor así:
public enum Color
{
Red = 1,
Blue = 1,
Green = 1
}
y el compilador está contento con esto. No esperaba que esto funcionara. No necesito volver a la enumeración, así que no estoy preocupado por tratar de volver, pero esto huele a funky. ¿Por qué el CLR permite valores múltiples para enumeraciones y debería usar una estructura para esto? (Una estructura parecía deber más pesado que una enumeración y esto parece funcionar)
En realidad, ya estás definiendo una estructura ... Detrás de escena una enumeración es solo una estructura (pero que deriva de System.Enum) y los valores de la enumeración se definen como constantes (puedes verificar esto con ILDASM).
Su definición enum se traduce en el siguiente código pseudo C #:
public struct Color : System.Enum
{
public const int Red = 1;
public const int Blue = 1;
public const int Green = 1;
}
El código anterior no se compilará en C # porque el compilador no permite definir una estructura con una clase base explícita, pero eso es lo que emite para una definición enum.
Como no hay problema con un tipo que contiene múltiples constantes que tienen el mismo valor, no hay ningún problema con la definición enum.
Pero dado que la enumeración no tiene valores únicos, es posible que tenga un problema al convertir a esta enumeración. Por ejemplo, las siguientes dos líneas de códigos devolverán el valor enum Rojo, porque el primer valor se selecciona arbitrariamente.
Color color1 = (Color)1;
Color color2 = (Color)Enum.Parse(typeof(Color), "1");
Estrictamente hablando, el valor enum no es Rojo, es 1, pero cuando imprimes el valor, verás Rojo.
Además, el siguiente booleano es verdadero, que se ve un poco raro ...
// true (Red is Green??)
bool b = Color.Red == Color.Green;
Al final, esto es perfectamente legal, pero depende de usted usarlo cuando tenga sentido ...
Aquí hay un enlace directo a la sección de mi tutorial de .NET que trata enumeraciones bajo el capó: http://motti.me/c1E
Eso es perfectamente legal C #. De la especificación del lenguaje C # versión 4.0, sección 14.3:
Múltiples miembros enum pueden compartir el mismo valor asociado. El ejemplo
enum Color { Red, Green, Blue, Max = Blue }
muestra una enumeración en la que dos miembros de la enumeración, azul y máx, tienen el mismo valor asociado.
Esta sería una definición perfectamente aceptable:
public enum AllTheThings
{
TheMoney = 1,
TheFreeRides = 1,
TheLieThatYouDenied = 2,
TheCallsYouveBeenMaking = 3,
TheTimesYouveBeenFaking = 4
}
Si piensas en cada valor enum como una constante, tiene sentido. No hay ninguna razón por la que no puedas tener dos constantes con el mismo valor:
public enum MyColor
{
Blue = 2,
Yellow = 3,
Green = 4
BlueAndYellow = 4,
}
Es lo mismo que:
public enum MyColor
{
Blue = 2,
Yellow = 3,
Green = 4,
BlueAndYellow = Green,
}
Básicamente, solo tienes la misma constante con dos nombres diferentes. BlueAndYellow
es un alias para Green
.
Una cosa a tener en cuenta aquí es que los valores no únicos dan como resultado valores perdidos y duplicados en el diseñador de Visual Studio.
public enum MyColor
{
Red= 1,
Green= 1,
Blue= 2
}
si usa esta enumeración en una propiedad navegable verá Verde, Verde, Azul en el diseñador en lugar de Rojo, Verde, Azul .