2013-03-11 8 views
6

In bestimmten zu bauen, wenn ich sage:Wie funktioniert die Compiler Verwendung ‚yield return‘ eine Klasse

public static IEnumerable<String> Data() 
    { 
     String connectionString = "..."; 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 

      IDataReader reader = new SqlCommand("", connection).ExecuteReader(); 

      while (reader.Read()) 
       yield return String.Format("Have a beer {0} {1}!", reader["First_Name"], reader["Last_Name"]); 

      connection.Close(); 
     } 
    } 

Wie funktioniert der Compiler geht über eine konkrete enumerable Klasse aus dieser Erzeugung?

+2

Es ist schwarze Magie, sage ich dir. –

Antwort

8

Es eine Zustandsmaschine baut, im Grunde:

  • Es schafft eine private verschachtelte Klasse, mit Instanzvariablen zu den lokalen Variablen in Ihrer Methode entsprechen, und eine state Variable, um zu verfolgen, wo es zu
  • GOTs
  • die Zustandsmaschine implementiert IEnumerable<T>IEnumerator<T> und - der MoveNext() Methode ruft auf der rechten Seite mit dem logischen (basierend auf state) und setzt eine Instanzvariable Spur des zuletzt ergab Wert zu halten (die Current Eigenschaft)
  • Der Compiler erzeugt eine „Skelett“ Methode mit der gleichen Signatur wie das Original, die

my article on the topic für mehr Details eine Instanz der Zustandsmaschine erzeugt. Beachten Sie auch, dass async/await in C# 5 mit vielen gleichen Ideen erstellt wird (obwohl es verschiedene Implementierungsunterschiede gibt).

+0

Sie möchten vielleicht 'yield return' innerhalb der' using' adressieren? – manojlds

+0

@manojlds: Nichts Besonderes, wirklich. Die Statusmaschine wird NACH dem 'using' erstellt und in ihre Initialisierungs- und Bereinigungskomponenten aufgeteilt. Ausnahme 'finally' Handler im Allgemeinen (nicht nur' using') werden in die 'Dispose' Methode der generierten Klasse verschoben. –

+0

@BenVoigt - OP sagt spezifisches Beispiel, und die Renditerückgabe innerhalb der Verwendung, speziell oder nicht, schien erwähnenswert. – manojlds

Verwandte Themen