96 votes

VS "outil de" surveillance rapide "de débogage et expressions lambda

91voto

JaredPar Points 333733

Non, vous ne pouvez pas utiliser les expressions lambda dans la montre / habitants / fenêtre exécution. Comme Marc l'a souligné c'est incroyablement complexe. Je voulais plonger un peu plus dans le sujet.

Ce que la plupart des gens ne considèrent pas avec l'exécution d'une fonction anonyme dans le débogueur est qu'il ne se produit pas dans un vide. L'acte de definining et l'exécution d'une fonction anonyme des modifications de la structure sous-jacente de la base de code. Changer le code, en général, et en particulier à partir de la fenêtre d'exécution, est une tâche très difficile.

Considérons le code suivant.

void Example() {
  var v1 = 42;
  var v2 = 56; 
  Func<int> func1 = () => v1;
  System.Diagnostics.Debugger.Break();
  var v3 = v1 + v2;
}

Ce code crée une fermeture unique pour capturer la valeur v1. Fermeture de capture est nécessaire chaque fois qu'une fonction anonyme qui utilise une variable déclarée en dehors de son champ d'application. Pour toutes fins utiles, v1 n'existe plus dans cette fonction. La dernière ligne en fait ressemble plus à la suivante

var v3 = closure1.v1 + v2;

Si l'Exemple de la fonction est exécuté dans le débogueur, il s'arrête à la ligne de fracture. Maintenant, imaginez si l'utilisateur a tapé la commande suivante dans la fenêtre espion

(Func<int>)(() => v2);

Afin d'exécuter correctement ce le débogueur (ou plus appropriatel EE) aurait besoin de créer une fermeture pour la variable v2. C'est difficile, mais pas impossible à faire.

Ce qui a vraiment fait un travail difficile pour les EE, c'est que la dernière ligne. Comment devrait-ligne maintenant être exécuté? Pour toutes fins utiles, la fonction anonyme supprimé la variable v2 et l'a remplacé par closure2.v2. Ainsi, la dernière ligne de code maintenant vraiment besoin de lire

var v3 = closure1.v1 + closure2.v2;

Mais en fait pour obtenir cet effet dans le code exige que l'EE pour modifier la dernière ligne de code qui est en fait une ENC action. Bien que cet exemple précis est possible, une bonne partie de l'scénarios ne sont pas.

Ce qui est encore pire, c'est l'exécution de cette expression lambda ne devrait pas être la création d'une nouvelle fermeture. Il devrait en fait être ajouter des données à l'origine de la fermeture. À ce stade, vous courez tout droit dans les limites des ENC.

Mon petit exemple, malheureusement, ne fait qu'effleurer la surface des problèmes que nous rencontrons. Je me dis que je vais écrire un article complet sur ce sujet et j'espère que je vais avoir le temps ce week-end.

64voto

Marc Gravell Points 482669

Les expressions Lambda, comme les méthodes anonymes, sont en fait très complexe bêtes. Même si l'on exclue Expression (.NET 3.5), ce qui laisse encore beaucoup de complexité, pas moins d'être capturé variables, ce qui fondamentalement la structure du code qui les utilise (ce que vous considérez comme des variables deviennent des champs généré par le compilateur classes), avec un peu de fumée et des miroirs.

En tant que tel, je ne suis pas le moins du monde surpris que vous ne pouvez pas les utiliser sans rien faire - il y a beaucoup de compilateur de travail (et la génération de type coulisse) qui prend en charge ce type de magie.

49voto

stusherwin Points 832

Vous ne pouvez pas utiliser d'expressions lambda dans les fenêtres Immediate ou Watch.

Vous pouvez cependant utiliser les expressions System.Linq.Dynamic , qui prennent la forme .Where ("Id = @ 0", 2) - il n’a pas la gamme complète des méthodes disponibles dans Linq standard ni la puissance des expressions lambda, mais quand même, c'est mieux que rien!

5voto

Patrick Points 846

cela pourrait aider: Fenêtre immédiate étendue pour Visual Studio (utilisez Linq, Lambda Expr dans le débogage)

Tout le meilleur, Patrick

2voto

Richard Points 54016

Les expressions lambda ne sont pas prises en charge par l’évaluateur d’expression du débogueur ... ce qui n’est guère surprenant puisque lors de la compilation, ils sont utilisés pour créer des méthodes (ou des arbres d’expression) plutôt que des expressions les voir).

De plus, bien sûr, ils pourraient former une fermeture, une autre couche entière de la structure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X