Pregunta

¿Los enums de C # son seguros para los tipos?

Si no, ¿cuáles son las implicaciones?

¿Fue útil?

Solución

Para dar una respuesta ligeramente diferente ... mientras que los valores son seguros desde la perspectiva de lanzamiento, aún no están marcados una vez que se han emitido, es decir,

enum Foo { A = 1, B = 2, C = 3 }    
static void Main()
{
    Foo foo = (Foo)500; // works fine
    Console.WriteLine(foo); // also fine - shows 500
}

Por este motivo, debe verificar los valores, por ejemplo, con un default en un switch que genera una excepción.

También puede consultar los (para valores que no sean [Flags] ) a través de:

bool isValid = Enum.IsDefined(typeof(Foo), foo);

Otros consejos

Sí, lo son.

Lo siguiente es de http://www.csharp-station.com/Tutorials /Lesson17.aspx

Las enumeraciones son constantes fuertemente tipadas. Son esencialmente tipos únicos que le permiten asignar nombres simbólicos a valores integrales. En la tradición de C #, están fuertemente tipados, lo que significa que una enumeración de un tipo no puede asignarse implícitamente a una enumeración de otro tipo, aunque el valor subyacente de sus miembros sea el mismo. En la misma línea, los tipos integrales y las enumeraciones no son intercambiables implícitamente. Todas las asignaciones entre diferentes tipos de enumeración y tipos integrales requieren una conversión explícita.

Para aquellos que sugieran utilizar Enum.IsDefined para hacer la validación de argumentos ... ¡no! Por Brad Abrams (de Guías de diseño del marco Actualización sobre Enum Design ):

  

Realmente hay dos problemas con Enum.IsDefined (). Primero carga la reflexión y un montón de metadatos de tipo frío, lo que la convierte en una llamada engañosamente cara. En segundo lugar, como se alude a la nota, aquí hay un problema con las versiones.

Sí, son .

  

Las enumeraciones son constantes fuertemente tipadas.   Son esencialmente tipos únicos que   le permite asignar nombres simbólicos a   valores integrales. En la tradición C #,   están fuertemente tipados, lo que significa que   una enumeración de un tipo no puede ser   asignado implícitamente a una enumeración de   otro tipo a pesar de que el   valor subyacente de sus miembros son   lo mismo. En la misma linea,   tipos integrales y enumeraciones no son   implícitamente intercambiables. Todos   asignaciones entre diferentes enumeración   tipos y tipos integrales requieren una   reparto explícito.

Sí.

C #: tipos de enumeración:

-Una enumeración segura de tipos de valores nombrados.

-Evita errores de programación

: el usuario puede controlar el tipo subyacente (predeterminado en int)

-También puede controlar los valores subyacentes

Técnicamente no, porque puedes representar un Enum como su valor base (int, long, etc). Sin embargo, si se asegura de usar solo la enumeración por sus nombres proporcionados, recibirá errores de tiempo de compilación si cambia el nombre de un valor enumerado sin actualizar sus referencias. En este sentido sí, es de tipo seguro.

Llego tarde a la fiesta aquí, pero quería lanzar algo extra ... Una actualización de .NET Framework Design Guidelines de Krzysztof Cwalina. Además de la excelente sugerencia anterior sobre la verificación para garantizar que se transfiera un valor válido a sus Enums, esto proporciona otra guía y consejo sobre cómo usarlos de manera efectiva, un montón de errores (especialmente los enums Flags involucrados) , etc.

sí, están fuertemente tipados o no puede hacer la conversión impilcita de las variables constantes de enumeración al valor entero u hv 2 expilcitamente hacer dat p.ej días de enumeración { Dom, Lun } int e = (int) days.sun; console.writeline (e);

Las enumeraciones de C # son tipos de significado seguro

  1. No puede realizar una conversión implícita del tipo subyacente a la enumeración real
  2. Además, no puede asignar un valor de una enumeración a otra enumeración, aunque los tipos subyacentes de ambas enumeraciones sean iguales. Siempre se requiere un lanzamiento explícito.
  3. Las enumeraciones hacen que tu código sea más legible y más fácil de mantener.

He encontrado un excelente video tutorial sobre enumeraciones que explican su naturaleza segura de tipo. Echa un vistazo a aquí y existe .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top