2016-05-28 15 views
5

Wenn wir schaffen Variable Aufzählungstyp und weisen sie einen AufzählungswertAufzählungstyp in C#

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

Da ENUM Werttyp ist, so wird der Wert von Entwicklern auf dem Stapel gespeichert wird, der durch Members.HighlyQualified.Here zurückgegeben Es ist klar, dass der Wert der Entwickler eine Zeichenfolge ist, die sich auf die Speicherstelle von Zeichen bezieht.

Nun

1. Wenn wir in einem int Members.HighlyQualifed Guss dann wieder der Wert 0. Wie es passiert?

2.Welcher Wert wird wirklich im Stapel für einen Aufzählungstyp gespeichert?

+1

Haben Sie [die Dokumentation] gelesen (https://msdn.microsoft.com/en- gb/library/cc138362.aspx)? Es wird alles darin erklärt. –

+1

Sie sollten Enum-Werte als Zahlen mit Namen betrachten. –

Antwort

10

Hier sind wir deutlich, dass der Wert der Entwickler Zeichenfolge, die sich auf die Speicherstelle von Zeichen.

Nein, ist es nicht. Der Wert von developers ist vom Typ Members. Es wird durch die -Methode in eine Zeichenfolge konvertiert. Sie werden die Console.WriteLine(object) Überladung aufrufen, die den Wert einkalkuliert - und dann wird ToString auf diesem geboxten Wert aufrufen und den entsprechenden enum Wertnamen geben.

Wenn wir Members.HighlyQualifed zu einem int umwandeln, ist der zurückgegebene Wert 0. Wie es passiert?

HighlyQualified ist das erste Mitglied, das in Members deklariert wurde, und Sie haben keinen bestimmten Wert zugewiesen. Standardmäßig weist der C# -Compiler dem ersten deklarierten Wert den Wert 0 zu und wird dann jedes Mal um 1 erhöht. Wenn Sie Members.Qualified in int umwandeln, erhalten Sie 1.

Welcher Wert wird tatsächlich für einen Aufzählungstyp im Stapel gespeichert?

Der Wert, ist effektiv nur eine Nummer. (In diesem Fall ein int, weil das der zugrunde liegende Standardtyp ist. Aber der Stack-Slot hat den richtigen Typ - den Enum-Typ.

3

The documentation erklärt den zugrunde liegenden Typ:

die darunter liegende Typ jedes Elements in der ENUM-Standardmäßig Int.

und wie die Werte erzeugt werden, wenn nicht explizit angegeben:

Wenn Sie Werte angeben, nicht für die Elemente in der Aufzählungsliste werden die Werte automatisch um 1 erhöht

in Ihrem Fall also ist die Erklärung entspricht:

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

Was ‚S auf dem Stapel ist der enum Typ selbst (Members in diesem Fall), und wenn Sie Console.WriteLine nennen es ToString auf das nennen, für die per the docs for that, kehrt:

eine Zeichenfolge, die den Namen der Konstanten enthält,