Domanda

Sto cercando di eseguire il debug del mio codice che viene eseguito da un progetto di unit test, ma quando provo ad entrare in un metodo, passa semplicemente alla riga successiva e il punto di interruzione all'interno di quel metodo non viene raggiunto. Il metodo è su una classe che si trova in un progetto diverso, ma tutto il codice è costruito in modalità debug e ho provato a ripulire e ricostruire la soluzione senza gioia.

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

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

È stato utile?

Soluzione

I blocchi di iteratori utilizzano l'esecuzione differita, ovvero: fino a quando non si inizia effettivamente a scorrere i dati, non viene eseguito nulla.

Quindi: i dati sono stati ripetuti? Qualcosa si sovrappone ai valori? Se è necessario aggiungere la logica di convalida che viene eseguita il prima possibile, al momento sono necessari 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++;
    }
}

Altri suggerimenti

Marc ha ragione. Il metodo viene eseguito differito e non è possibile entrare nel metodo fino a quando l'iteratore non viene effettivamente eseguito.

Quando devo eseguire il debug di un blocco iteratore in un unit test, faccio quanto segue. Supponiamo che il metodo si chiama GetStuff.

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

La chiamata .ToList () forzerà l'esecuzione dell'iteratore al completamento. Ho quindi impostato un punto di interruzione all'interno del metodo GetStuff e ho avviato una sessione di debug

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top