2014-05-09 16 views
8

Diciamo che hai scritto un enumeratore personalizzato per il codice qui sotto:In che modo Visual Studio valuta l'oggetto IEnumerable senza interferire con MoveNext di IEnumerator ?

public class School : IEnumerable<Student> 

E poi nel codice client, avete fatto queste cose:

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" } 
    }; 
} 

Quindi, impostare un break-point sul metodo MoveNext implementazione della tua classe StudentEnumerator.

Poi, quando si esegue il codice e le pause debugger dopo aver costruito la query/IEnumerable in questo caso, e si espande la Results View come nella foto mostrato di seguito, come si fa di Visual Studio valutare la sequenza senza rompere nella sua enumeratore di MoveNext?

Sono sempre stato curioso di questo.

enter image description here

+1

Cercare FuncEval. Bella funzionalità con molti avvertimenti. Vedi http://blogs.msdn.com/b/jmstall/archive/2005/03/23/400794.aspx –

+0

Impressionante. Si prega di aggiungere questo come risposta. Lo contrassegnerò come quello corretto. –

risposta

7

Visual Studio utilizza una funzionalità chiamata FuncEval, che consente fondamentalmente all'IDE di eseguire il codice. Ciò consente molte funzioni interessanti, ma ovviamente ci sono numerous caveats di farlo. Gli esempi sono effetti collaterali su proprietà, deadlock, passaggi saltati in un loop e strane esperienze di debug.

3

Questo perché il debugger è collegato soltanto al vostro processo in esecuzione non Visual Studio stesso. Se hai aperto una seconda copia di Visual Studio, allegato un debugger alla prima copia di Visual Studio, quindi inserisci un breakpoint all'interno del codice nella seconda copia in modo che il punto di interruzione venga colpito quando hai valutato l'elenco nella prima copia di Visual Studio (e la prima copia di Visual Studio rimarrà in sospeso fino a quando non si preme continuare sulla seconda copia).

MODIFICA: Grazie a Brian's link, il modo in cui questo viene fatto è tramite FuncEval.

+0

Grazie mille, Scott. –