2009-06-21 5 views
8

Je suis en train de déboguer mon code qui est en cours d'exécution d'un projet de test unitaire, mais lorsque je tente d'entrer dans une méthode, il passe tout droit sur la prochaine ligne et le point d'arrêt à l'intérieur de cette méthode n'est pas touché. La méthode est sur une classe qui est dans un projet différent, mais tout le code est construit en mode débogage et j'ai essayé de nettoyer et de reconstruire la solution sans joie.ne marchent pas dans le bloc itérateur pendant le débogage (C#)

Cependant, ce ne est arrivé depuis que j'ajouté un bloc itérateur à la méthode. Quand je l'enlève et que je le reconstruis, je peux intervenir. Bizarre? J'utilise Visual Studio 2010 Beta 1, est-ce que ce serait juste un bug?

+2

Nous obtenons ce « bug » rapport assez souvent. Voici un petit casse-tête que vous savez maintenant la réponse à: 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 –

Répondre

12

blocs Iterator utilisent l'exécution différée - ce qui signifie: jusqu'à ce que vous commencez réellement itérer sur les données, rien est exécuté.

Donc: les données ont-elles été itérées? Est-ce que quelque chose est en boucle sur les valeurs? Si vous avez besoin d'ajouter une logique de validation qui fonctionne le plus tôt possible, vous avez besoin actuellement deux méthodes:

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 est correct. La méthode est différée et vous ne pouvez pas entrer dans la méthode tant que l'itérateur n'est pas exécuté.

Quand je dois déboguer un bloc itérateur dans un test unitaire, je fais ce qui suit. Supposons que la méthode s'appelle GetStuff. L'appel .ToList() force l'itérateur à s'exécuter jusqu'à la fin. Je me suis alors mis un point d'arrêt dans la méthode GetStuff et démarrer une session de débogage

Questions connexes