Não é possível passo para iterador bloco, enquanto a depuração (C #)
-
06-07-2019 - |
Pergunta
Eu estou tentando depurar o meu código que está sendo executado a partir de um projeto de teste de unidade, mas quando eu tento passo para um método, ele simplesmente passa direto para a próxima linha eo ponto de interrupção dentro desse método não é atingido. O método está em uma classe que está em um projeto diferente, mas todo o código é construído no modo de depuração e eu tentei limpeza e reconstrução da solução sem alegria.
No entanto, isso só tem acontecido desde que eu adicionei um bloco iterador para o método. Quando eu removê-lo e reconstruir, eu posso entrar bem. Estranho?
Estou usando o Visual Studio 2010 Beta 1, isso poderia ser apenas um bug?
Solução
Iterator usar execução adiada - ou seja:. até que você realmente começar a iteração sobre os dados, nada é executado
Assim: se os dados foram iterated? É qualquer coisa looping sobre os valores? Se você precisa adicionar lógica de validação que é executado tão cedo quanto possível, você precisa atualmente dois 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++;
}
}
Outras dicas
Marc está correto. O método é adiada executado e você não pode passo para o método até que o iterador realmente executa.
Quando eu preciso para depurar um bloco iterador em um teste de unidade que eu faça o seguinte. Suponha que o método é chamado GetStuff.
[TestMethod]
public void TestGetStuff() {
var obj = GetStuffObje();
var list = obj.GetStuff().ToList();
}
O .ToList () chamada irá forçar o iterador para executar até a conclusão. Eu, então, definir um ponto de interrupção dentro do método GetStuff e iniciar uma sessão de depuração