2016-05-28 41 views
5

Quando creiamo variabile del tipo di enumerazione e assegna un valore di enumerazionetipo di enumerazione in C#

enum Members{HighlyQualified, Qualified, Ordinary} 
class 
{ 
static void Main() 
{ 
Members developers = Members.HighlyQualified; 
Console.WriteLine(developers);//write out HighlyQualified 
} 
} 

Poiché enum è tipo di valore così il valore di sviluppatori è memorizzato sulla pila che viene restituita da Members.HighlyQualified.Here siamo chiari che il valore degli sviluppatori è una stringa che si riferisce alla posizione di memoria dei caratteri.

Ora,

1. Se gettiamo Members.HighlyQualifed ad un int, allora il valore restituito è 0. Come succede?

2. Quale valore è realmente memorizzato nello stack per un tipo di enumerazione?

+1

Hai letto [la documentazione] (https://msdn.microsoft.com/ gb/library/cc138362.aspx)? È tutto spiegato qui. –

+1

Dovresti considerare i valori Enum come numeri con i nomi. –

risposta

10

Eccoci chiaro che il valore degli sviluppatori è stringa cui fanno riferimento alla posizione di memoria di personaggi.

No, non lo è. Il valore di developers è di tipo Members. È convertito in una stringa con il metodo Console.WriteLine. Chiamerai il sovraccarico Console.WriteLine(object), che inserisce il valore - e quindi Console.WriteLine chiamerà ToString su quel valore box, dando il nome del valore enum appropriato.

Se lanciamo Members.HighlyQualifed su un int, il valore restituito è 0. Come succede?

HighlyQualified è il primo membro dichiarato in Members e non è stato assegnato alcun valore specifico. Per impostazione predefinita, il compilatore C# assegna un valore di 0 al primo valore dichiarato, quindi incrementa di 1 ogni volta. Se lanci Members.Qualified su int, ottieni 1.

Quale valore è realmente memorizzato nello stack per un tipo di enumerazione?

Il valore, che è efficacemente solo un numero. (In questo caso, un int perché è il tipo di base predefinito, ma lo slot di stack ha il tipo giusto, il tipo di enumerazione

3

The documentation spiega tipo sottostante:

Per default tipo sottostante di ogni elemento enum è int.

e come i valori vengono generati quando non esplicitamente specificato:

Quando non si specificano i valori per gli elementi della lista enumeratore, i valori vengono automaticamente incrementati di 1.

Quindi, nel tuo caso, la dichiarazione equivale a:

enum Members : int 
{ 
    HighlyQualified = 0, 
    Qualified = 1, 
    Ordinary = 2 
} 

Cosa 'S sullo stack è il tipo enum stesso (Members in questo caso), e quando si chiama Console.WriteLine si chiamerà ToString su quello, per il quale, per the docs for that, restituisce:

una stringa contenente il nome della costante