No se puede ingresar al bloque iterador mientras se depura (C #)
-
06-07-2019 - |
Pregunta
Estoy tratando de depurar mi código que se está ejecutando desde un proyecto de prueba unitaria, pero cuando trato de ingresar a un método, simplemente pasa directamente a la siguiente línea y no se alcanza el punto de interrupción dentro de ese método. 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.
Sin embargo, esto solo ha sucedido desde que agregué un bloque iterador al método. Cuando lo elimino y reconstruyo, puedo intervenir bien. ¿Extraño?
Estoy usando Visual Studio 2010 Beta 1, ¿podría ser solo un error?
Solución
Los bloques de iterador usan ejecución diferida, es decir: hasta que realmente comience a iterar sobre los datos, no se ejecuta nada.
Entonces: ¿se han iterado los datos? ¿Hay algo en bucle sobre 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++;
}
}
Otros consejos
Marc tiene razón. El método se difiere ejecutado y no puede ingresar al método hasta que el iterador realmente se ejecute.
Cuando necesito depurar un bloque iterador en una prueba unitaria, hago lo siguiente. Suponga que el método se llama GetStuff.
[TestMethod]
public void TestGetStuff() {
var obj = GetStuffObje();
var list = obj.GetStuff().ToList();
}
La llamada .ToList () forzará al iterador a ejecutarse hasta su finalización. Luego establezco un punto de interrupción dentro del método GetStuff y comienzo una sesión de depuración