2009-06-21 4 views
8

Estoy intentando depurar mi código que se está ejecutando desde un proyecto de prueba unitaria, pero cuando trato de entrar en un método, simplemente pasa directamente al siguiente línea y el punto de interrupción dentro de ese método no se golpea. El método está en una clase que está en un proyecto diferente, pero todo el código está construido en modo de depuración y he intentado limpiar y reconstruir la solución sin alegría.No puedo ingresar al bloque del iterador mientras estoy depurando (C#)

Sin embargo, esto solo ha sucedido desde que agregué un bloque iterador al método. Cuando lo elimino y lo reconstruyo, puedo entrar bien. ¿Extraño?

Estoy usando Visual Studio 2010 Beta 1, ¿podría ser solo un error?

+2

Obtuvimos este informe de "errores" con bastante frecuencia. Aquí hay un pequeño acertijo al que ahora conoce la respuesta: http://blogs.msdn.com/ericlippert/archive/2007/09/05/psychic-debugging-part-one.aspx https: // blogs .msdn.com/ericlippert/archive/2007/09/06/psychic-debugging-part-two.aspx –

Respuesta

12

Los bloques iteradores usan la ejecución diferida, es decir: hasta que realmente comiences a iterar sobre los datos, no se ejecuta nada.

Entonces: ¿se han repetido los datos? ¿Hay algo que pase por encima de los valores? Si necesita agregar una lógica de validación que se ejecute lo antes posible, actualmente necesita dos métodos:

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 es correcto. El método se ha pospuesto y no se puede entrar en el método hasta que el iterador realmente se ejecute.

Cuando necesito depurar un bloque iterador en una prueba de unidad, hago lo siguiente. Supongamos que el método se llama GetStuff.

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

La llamada .ToList() obligará al iterador a ejecutarse hasta su finalización. Luego establecí un punto de interrupción dentro del método GetStuff y comencé una sesión de depuración

Cuestiones relacionadas