2014-05-09 14 views
8

Angenommen, Sie haben einen benutzerdefinierten Enumerator für den folgenden Code geschrieben:Wie evaluiert Visual Studio das IEnumerable ohne in seinen IEnumerator <T> MoveNext zu brechen?

public class School : IEnumerable<Student> 

Und dann im Client-Code, haben Sie dies:

static void Main(string[] args) 
{ 
    var school = CreateSchoolWithStudents(); 

    var query = from student in school 
       where student.Name.StartsWith("S") 
       select student; 

    Debugger.Break(); 
} 

private static School CreateSchoolWithStudents() 
{ 
    return new School 
    { 
     new Student { Name = "Sathyaish" }, 
     new Student { Name = "John" }, 
     new Student { Name = "Carol" }, 
     new Student { Name = "Peter" } 
    }; 
} 

Dann eine Pause-Punkt auf der Methode MoveNext eingestellt Implementierung Ihrer StudentEnumerator Klasse.

Dann, wenn Sie den Code und die Debugger bricht nach Konstruktion der Abfrage/IEnumerable in diesem Fall laufen und Sie die Results View wie im Bild unten erweitern, wie funktioniert Visual Studio bewerten die Sequenz ohne MoveNext in seine enumerator bricht?

Ich war schon immer neugierig darauf. Diese

enter image description here

+1

Nachschlagen FuncEval. Nettes Feature mit vielen Vorbehalten. Siehe http://blogs.msdn.com/b/jmstall/archive/2005/03/23/400794.aspx –

+0

Ehrfürchtig. Bitte fügen Sie dies als Antwort hinzu. Ich werde es als das richtige markieren. –

Antwort

7

Visual Studio verwendet eine Funktion namens FuncEval, mit der die IDE den Code ausführen kann. Dies ermöglicht viele nette Funktionen, aber offensichtlich gibt es numerous caveats davon. Beispiele sind Nebenwirkungen auf Eigenschaften, Deadlocks, das Überspringen von Schritten in einer Schleife und seltsame Debuggerfahrungen.

3

ist, weil der Debugger nur auf Ihren laufenden Prozess angeschlossen ist nicht Visual Studio selbst. Wenn Sie eine zweite Kopie von Visual Studio geöffnet haben, einen Debugger an die erste Kopie von Visual Studio angefügt haben, dann einen Haltepunkt innerhalb des Codes in der 2. Kopie gesetzt haben, dass der Haltepunkt bei der Auswertung der Liste in der ersten Kopie von Visual Studio (und die erste Kopie von Visual Studio würde hängen bleiben, bis Sie auf der zweiten Kopie fortfahren.

BEARBEITEN: Dank Brian's link ist die Art, wie dies getan wird, über FuncEval.

+0

Vielen Dank Scott. –