Már korábban is volt szerencsénk belefutni olyan szituációba, amikor a Visual Studio debuggere meglepetéseket okozott. Szinte minden debuggerrel kapcsolatos anomáliát ugyanaz a jelenség idézi elő:
Ahhoz, hogy a Watch vagy Locals ablak ki tudja írni a változóid és azok tulajdonságainak értékét, ki kell értékelnie őket. Akkor is, ha a programod ezen a ponton erre nem is számít.
Itt vagyunk tulajdonképpen kényszerhelyzetben: néha szeretnénk debuggolni és néha olyan kódot, ami ezt nem viseli el. Mit tehetünk a debugger általi korai kiértékelések elkerülése érdekében? Szabályozhatjuk, hogy mit és hogyan írjon ki a Visual Studio debuggere!
A megoldást a System.Diagnostics névtér DebuggerBrowsable attribútuma jelenti. Három különböző értékkel lehet vele tulajdonságokat cimkézni: Collapsed, Never, RootHidden. A Collapsed a jól megszokott debuggolási élményt nyújtja: a tulajdonság értékét látjuk. A Never-rel ellátott tulajdonságok nem jelennek meg maguktól a debuggerben, de kézzel megadva őket (például a Watch ablakban) azért láthatóak. A RootHidden hatására maga a tulajdonság nem látszik, de gyermekelemei igen.
Alább egy egyszerű példa látható: a TestClass osztály három tulajdonságát a három különböző attribútum-értékkel láttam el.
public class TestClass
{
[DebuggerBrowsable( DebuggerBrowsableState.Collapsed )]
public string[] Collapsed
{
get { return new string[] { "ez", "a", "collapsed" }; }
}
[DebuggerBrowsable( DebuggerBrowsableState.Never )]
public string[] Never
{
get { return new string[] { "ez", "meg", "a", "collapsed" }; }
}
[DebuggerBrowsable( DebuggerBrowsableState.RootHidden )]
public string[] RootHidden
{
get { return new string[] { "ilyen", "a", "roothidden" }; }
}
}
Példányosítok egyet a TestClass-ból:
static void Main( string[] args )
{
TestClass tc = new TestClass();
Console.ReadKey();
}
Beteszek egy breakpointot és megfigyelem a Locals és Watch ablakokat:
A Never-rel ellátott tulajdonság nem látható a Locals ablakban, csak a Watch ablakban explicit megadva értékelődik ki. A Collapsed olyan mintha oda sem írták volna, a RootHidden-es tulajdonság pedig nem látszik, de a gyermekelemei, azaz a gettere által visszaadott string[] igen!