2009-06-21 10 views
8

Sto provando a eseguire il debug del mio codice che viene eseguito da un progetto di unit test, ma quando provo ad entrare in un metodo, passa direttamente al successivo linea e il punto di interruzione all'interno di quel metodo non viene colpito. Il metodo è su una classe che si trova in un progetto diverso, ma tutto il codice è costruito in modalità debug e ho provato a pulire e ricostruire la soluzione senza alcuna gioia.Impossibile accedere al blocco iteratore durante il debug (C#)

Tuttavia, questo è successo solo da quando ho aggiunto un blocco iteratore al metodo. Quando lo rimuovo e lo ricostruisco, posso intervenire. Strano?

Sto usando Visual Studio 2010 Beta 1, potrebbe essere solo un bug?

+2

Otteniamo questo rapporto "bug" ragionevolmente spesso. Ecco un piccolo puzzle che ora conosci la risposta a: http://blogs.msdn.com/ericlippert/archive/2007/09/05/psychic-debugging-part-one.aspx https: // blog .msdn.com/ericlippert/archive/2007/09/06/psichico-debug-parte-two.aspx –

risposta

12

I blocchi di iteratore utilizzano l'esecuzione posticipata, ovvero finché non si avvia effettivamente l'iterazione dei dati, non viene eseguito nulla.

Quindi: i dati sono stati iterati? C'è qualcosa che si sovrappone ai valori? Se avete bisogno di aggiungere logica di convalida che viene eseguito il più presto possibile, è attualmente bisogno di due metodi:

public static IEnumerable<int> GetNumbers(int from, int to) { 
    // this validation runs ASAP (not deferred) 
    if (to < from) throw new ArgumentOutOfRangeException("to"); 
    return GetNumbersCore(from, to); 
} 
private static IEnumerable<int> GetNumbersCore(int from, int to) { 
    // this is all deferred 
    while (from <= to) { 
     yield return from++; 
    } 
} 
6

Marc è corretta. Il metodo viene posticipato e non è possibile passare al metodo finché l'iteratore non viene effettivamente eseguito.

Quando ho bisogno di eseguire il debug di un blocco iteratore in un test di unità, faccio quanto segue. Supponiamo che il metodo sia chiamato GetStuff.

[TestMethod] 
public void TestGetStuff() { 
    var obj = GetStuffObje(); 
    var list = obj.GetStuff().ToList(); 
} 

La chiamata .ToList() forza l'iteratore al completamento. Ho quindi impostato un punto di interruzione all'interno del metodo GetStuff e avvio una sessione di debug

Problemi correlati