2016-08-05 14 views
0

ich über Aufzählungen in einem Buch lese, und das folgende Codebeispiel gegeben wurde:Verwirrung über Rückgabewert von Enum.GetValues ​​()

namespace FunWithEnums 
{ 
    enum EmpType : byte 
    { 
     Manager = 10, 
     Grunt = 1, 
     Contractor = 100, 
     VicePresident = 9 

    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("**** Fun with Enums *****"); 

      EmpType emp = EmpType.Contractor; 
      EvaluateEnum(emp); 
      Console.ReadLine(); 
     } 

     static void EvaluateEnum(System.Enum e) 
     { 
      Array enumData = Enum.GetValues(e.GetType()); 

      for (int i =0; i < enumData.Length; i++) 
      { 
       Console.WriteLine("Name: {0}, Value: {0:D}", enumData.GetValue(i)); 
      } 
      Console.WriteLine(); 
     } 
} 

Ich bin sehr verwirrt, was in ausgedruckt wird der Forloop. Der Ausgang ist

Name: Grunt, Wert: 1

Name: Vizepräsident, Wert: 9

Name: Manager Wert: 10

Name: Auftragnehmer, Wert: 100

Aber wie erhält es sowohl den Namen UND den Wert jedes aufgezählten Elements? Laut der Microsoft-Dokumentation sollte Array enumData = Enum.GetValues(e.GetType()); nur "ein Array der Werte der Konstanten in einer angegebenen Enumeration" zurückgeben. Ich nehme an, dass es sich bei Konstanten auf "Manager", "Grunt", "Contractor", "VicePresident" bezieht, im Gegensatz zu 10, 1, 100 und 9. Also warum gibt es jedes Paar statt nur den Namen von der Angestelltyp? Außerdem gibt die Ausgabe des folgenden Codes Console.WriteLine(enumData.GetValue(1)); nur einen Wert zurück, der "VicePresident" lautet und die Zahl 9 nicht wie im Forloop zurückgibt. Warum ist das?

+0

„Ich gehe davon aus“: Das ist dein Problem recht. Sie haben eine Geschichte darüber gemacht, was "Werte der Konstanten" bedeuten. Die Ausgabe Ihres Programms zeigt, dass die Geschichte eindeutig falsch war. Nimm also das, was du aus der Ausgabe gelernt hast, und versuche eine neue Geschichte zu konstruieren, die mit den Fakten vor dir konsistent ist. –

+0

Also, wenn es sich auf die "Konstante" bezieht, bezieht es sich auf den Name-Wert PAIR, nicht nur den Namen? – FrostyStraw

+1

Kein Wertpaar, ein Objekt mit Methoden und Membervariablen und übergeordneten Klassen, und das von Console.WriteLine nach seiner Zeichenfolgendarstellung abgefragt wird, wenn eine Zeichenfolge gewünscht wird, und seiner numerischen Darstellung, wenn dies gewünscht wird. – AgapwIesu

Antwort

2

GetValue gibt einen Aufzählungswert Objekt. Dieses Objekt gehört zu einer Klasse (Enum-Klasse), die mit ihrem Namen in eine Zeichenfolge umgewandelt oder mit ihrem Wert in eine Ganzzahl umgewandelt wird. Wenn also die String-Formatierung eine Zeichenkette erwartet, bekommt sie das.Wenn er nach einer Dezimalzahl fragt (Format-Spezifizierer D), gibt der Aufzählungswert den Standard-Basiswert an, der Int32 ist, der leicht in eine Dezimalzahl umgewandelt wird.

+0

So gibt GetValue() ein Objekt zurück, weil das Array enumData OBJECTS dank der Enum.GetValues ​​() -Methode enthält, die zum Auffüllen des Arrays verwendet wurde? – FrostyStraw

+0

Ja, GetValues ​​gibt Ihnen eine Reihe von Werten, von denen jede eine Enum-Klasse ist. – AgapwIesu

+0

In der Schleife könnten Sie etwas wie foreach (var Wert in e.getValues ​​()) Console.WriteLine ("Name: {0}, Wert: {0: D}", Wert); – AgapwIesu

5

Console.WriteLine(String, Object) verwendet the "Composite Formatting" features of .NET, und wenn Sie es einen ENUM-Wert bieten, gilt es the "Enumeration Format Strings":

G oder g

Zeigt die Aufzählung Eintrag als String-Wert, wenn möglich, und sonst Displays der ganzzahlige Wert der aktuellen Instanz .

So können Sie {0:G} in der Zeichenfolge einbetten Enum Name zu ersetzen. Obwohl nicht erwähnt, entspricht {0:G}{0}, was Sie in Ihrem Beispiel mit Console.WriteLine("Name: {0},... beobachtet haben.

D oder D

Zeigt den Aufzählungs Eintrag als Integerwert in der kürzesten Darstellung möglich.

So können Sie {0:D} in der Zeichenfolge einbetten die Enum Wert zu ersetzen.

0

Der Code explizit druckt den Wert zweimal

Console.WriteLine("Name: {0}, Value: {0:D}", enumData.GetValue(i)); 

Der erste {0} nur den Rohwert drucken, das zweite hat eine Formatierungs angegeben (D)

0

Die Werte werden durch die angegebene Formatierung ausgedruckt. Versuchen Sie, {0: D} zu entfernen, und verwenden Sie nur {0}. Wie in der Liste, die für die Liste erstellt wird, wird die Art in angegeben:

 Array enumData = Enum.GetValues(e.GetType());