Comment le débogueur Visual Studio décide-t-il quelles valeurs peuvent être affichées avec le visualiseur Text/XML/HTML ?
-
24-12-2019 - |
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).
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
String
ou a unToString
passer outre- 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.