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?

Foi útil?

Solução

blocos

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top