2011-07-23 31 views
5

¿Los tipos enum están almacenados como ints en C#?¿Los tipos enum están almacenados como ints en C#?

¿La enumeración de abajo puede representar como 0, 1, 2?

Si no es así, ¿cuál es la forma más ligera para definir una enumeración?

public enum ColumnType 
{ 
    INT,STRING,OBJECT 
} 
+0

¿Qué quiere decir "forma más liviana", memoria ¿consumo? –

+0

Nota secundaria; sería poco común SUPERAR los nombres; no válido ... Solo inusual. –

Respuesta

5

From the MSDN

El tipo subyacente predeterminado de elementos de enumeración es int.

Por defecto, la primera empadronador tiene el valor 0, y el valor de cada empadronador sucesiva se incrementa en 1.

Así que sus suposiciones son correctas. Enum s se almacenan como int s y su ejemplo se representan como 0, 1, 2. Sin embargo, no se debe confiar en esto y siempre se refieren a ellos por su nombre asignado por si acaso alguien anula el valor predeterminado.

5

Sí, un enum se almacena como un int por defecto., Como se indica here.

También puede especificar el tipo subyacente, por ejemplo .:

enum Foo : short 
{ 
    Bar, 
    Baz 
} 

A pesar de que por lo general no es necesario.

2

Por defecto sí:

http://msdn.microsoft.com/en-us/library/sbbt4032(v=vs.80).aspx

La palabra clave enum se utiliza para declarar una enumeración, un tipo distinto que consiste en un conjunto de constantes con nombre llamado la lista empadronador. Cada tipo de enumeración tiene un tipo subyacente, que puede ser cualquier tipo integral excepto char. El tipo subyacente predeterminado de los elementos de enumeración es int. Por defecto, la primera empadronador tiene el valor 0, y el valor de cada empadronador sucesiva se incrementa por 1.

2

El tipo subyacente predeterminado para una enum es un int, pero diferentes tipos se puede utilizar de forma explícita. Por ejemplo, puede utilizar byte:

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri}; 

Ver http://msdn.microsoft.com/en-us/library/sbbt4032.aspx para más detalles.

1

Cada tipo de enumeración tiene un tipo subyacente, que puede ser cualquier tipo integral excepto Char.Sí su enumeración puede representar como 0,1,2 por defecto y es la forma más ligera para definir una enumeración

Cómo siempre se define enumeración mediante la definición de valor inicial como su requisito y la asignación de valores integrales explícitamente a cada uno de su enumeración miembros, así

1

el punto sobre tipos subyacente es ya bien cubierto, por lo que a añadir un contexto diferente:

a nivel IL/tiempo de ejecución, los casos de enumeraciones no existen. Sólo existen:

a: para el compilador b: al tiempo de ejecución como un valor en caja c: en los metadatos (parámetro/campo/declaraciones de variables)

En los demás casos, que son puramente los valores de tipo entero (más comúnmente int). El compilador usa variables enum (etc) para análisis estático, resolución de sobrecarga, etc. pero los códigos de operación que emite son idénticos a los que habría emitido para valores enteros constantes/literales; es decir,

SomeEnum foo = SomeEnum.WithValueOne; 
int bar = 1; 

tendrán IL idéntica (excepto el tipo de variable, tal vez).

La única vez que se pone interesante es si la emisión de una operación de caja, o una llamada como .ToString(), etc.

Por lo tanto: siempre y cuando no se encajonarlos (almacenarlos en un campo object/etc.), entonces no hay (en tiempo de ejecución) ninguna diferencia significativa entre una enumeración o un entero cuando se trata de almacenamiento o rendimiento (a menos que use .ToString(), etc.)

Cuestiones relacionadas