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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top