Comment le débogueur Visual Studio décide-t-il quelles valeurs peuvent être affichées avec le visualiseur Text/XML/HTML ?

StackOverflow https://stackoverflow.com//questions/22078369

Question

J'ai remarqué que lorsque je visualise des variables de certains types, telles que XÉlément, dans la fenêtre Espion de Visual Studio, si je clique sur la loupe Debug Visualizers, les mêmes visualiseurs qui s'appliquent sur les chaînes (Texte, XML, HTML) apparaissent.Je n'ai jamais vu cela se produire sur un autre type auparavant.Comment le débogueur décide-t-il de procéder ainsi ?

MODIFIER:Voici une capture d'écran de la fenêtre Watch, démontrant que XElement peut être affiché avec Text Visualizer, contrairement à System.Version (qui implémente également ToString).enter image description here

Était-ce utile?

La solution

Il s’agit en fait d’une question un peu complexe car plusieurs éléments de l’évaluateur d’expression contrôlent l’affichage des visualiseurs personnalisés.

Pour les visualiseurs Texte, XML et HTML, la réponse est assez simple car ce sont des visualiseurs intégrés au débogueur.Si IDebugProperty2::GetPropertyInfo Retour DBG_ATTRIB_VALUE_RAW_STRING dans le cadre des indicateurs d'attribut, ce visualiseur sera affiché.Lorsque l'utilisateur sélectionne l'un de ces visualiseurs, le débogueur rappellera IDebugProperty3::GetStringChars / GetStrigCharLength afin d'obtenir la valeur de chaîne à transmettre au visualiseur.

Pour les visualiseurs définis par l'utilisateur, bien que cela soit un peu plus complexe, c'est probablement un peu trop pour une réponse ici.MSDN a cependant quelques informations sur la façon de procéder.

http://msdn.microsoft.com/en-us/library/vstudio/bb162331(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/vstudio/bb146621(v=vs.100).aspx

Considérons maintenant l'exemple spécifique évoqué dans cette question : Version contre. XElement.La première chose à noter est que vous obtenez un comportement différent selon la langue dans laquelle vous déboguez.C#, comme vous l'avez remarqué, affiche le visualiseur uniquement pour XElement tandis que VB.Net affichera le visualiseur pour les deux XElement et Version.Cela n'est pas surprenant à certains égards car l'indicateur du visualiseur est contrôlé par l'EE et chaque langage a sa propre implémentation.

Algorithme C#

Si la valeur est saisie pour String ou a une conversion de référence implicite en XNode puis le visualiseur s'affiche.

Dans ce cas XElement dérive de XNode par conséquent, il obtient le visualiseur.Le Version le type ne dérive pas de XNode et ce n'est pas String donc il n'obtient pas le visualiseur

Algorithme VB.Net

Si la valeur affichée répond à l'un des critères suivants, le visualiseur s'affiche

  1. String ou a un ToString passer outre
  2. A un DebuggerDisplay qui pointe vers une valeur qui se qualifie pour 1 ou 2

Dans ce cas les deux XElement et Version passer outre ToString donc le visualiseur est affiché dans les deux cas

Pourquoi cette différence ?

Me bat.Lorsque j'ai écrit l'implémentation de VB.Net, je voulais prendre en charge le visualiseur dans autant d'endroits que possible (c'est vraiment utile).Par conséquent, chaque fois que la valeur finale affichée était un String J'ai affiché le visualiseur.Je n'ai pas vraiment pensé à consulter l'équipe C# lorsque j'ai pris cette décision.Jusqu'à ce que je fasse des recherches sur la base de code pour répondre à cette question, je ne savais même pas qu'il y avait une différence :)

Autres conseils

Comment le débogueur décidait-il de faire cela?

Il dispose d'un registre de visualiseurs en fonction du type d'objet.

Vous êtes libre d'écrire le vôtre.

Si vous ne voyez pas de visualiseur, alors tout simplement aucune n'a été enregistrée.Et vs vient avec de bons standards.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top