Olá, tudo bem?

No nosso trabalho, passamos boa parte do tempo debugando, ou depurando Smile aplicações, postei dois artigos sobre as novidades na depuração de código no Visual Studio 2010,aqui, aqui e aqui.

Esse três artigos que publiquei, mostram recursos do Visual Studio 2010, mas desde a versão 2.0 do .NET Framework, temos um atributo chamado DebuggerDisplay.

Com o DebuggerDisplay conseguimos definir, o que gostaríamos de ver facilmente, na janela onde podemos navegar entre as propriedades de uma classe durante a depuração do código.

Detalhe que o atributo não está limitado ao C#, podemos utilizar tranquilamento com VB.NET, F# e C++.

Vamos imaginar a classe Posicao abaixo, onde eu armazeno o valor X e Y de um determinado objeto de um jogo por exemplo.

class Posicao
{
    public int X { get; set; }
    public int Y { get; set; }
}

 

Agora instanciamos a classe, e definimos alguns valores.

static void Main(string[] args)
{
    var posicao = new Posicao {X = 50, Y = 100};
}

 

Essa é uma classe simples, mas da para ver bem o funcionamento do DebuggerDisplay. Agora compilando o programa, e depurando o mesmo, quero descobrir o valor de X e Y, então eu dependo da janela Locals onde posso navegar nas propriedades do objeto, ou navegando nos menus abertos sobre o objeto ao passar o mouse pelo mesmo.

DebuggerDisplay01

Na imagem acima, da para ver que a coluna value, da janela Locals mostra o tipo do meu objeto, que nesse caso é OperadoresCSharp.Posicao, o mesmo ocorre com o menu flutuante, em ambos os casos eu preciso expandir o objeto para ver os valores das propriedades.

Agora utilizando o atributo DebuggerDisplay, que está no namespace System.Diagnostics eu consigo definir, por exemplo, quais propriedades da minha classe eu quero mostrar diretamente no lugar onde é mostrado o tipo do objeto.

[DebuggerDisplay("{X} {Y}")]
class Posicao
{
    public int X { get; set; }
    public int Y { get; set; }
}

No atributo, eu consigo colocar entre {} o nome de uma propriedade, que é o que fiz, agora na depuração já melhorou um pouco.

DebuggerDisplay02

Já melhorou, só que ainda não é o ideal, o que é 50, 100? Só estou mostrando os valores das propriedades, mas não sei de qual propriedade é o valor 50 ou 100, felizmente conseguimos “nomear”, e fazer algo assim X = {X}.

[DebuggerDisplay("X={X} Y={Y}")]
class Posicao
{
    public int X { get; set; }
    public int Y { get; set; }
}

Agora sim, na hora de depurar o código, fica mais claro saber que o 50 é do X e 100 é do Y.

DebuggerDisplay03

Mas isso funciona só com propriedades? Felizmente não, vamos imaginar que por algum motivo, é importante saber a soma de X e Y, e eu possuo um método chamado SomarValores(), consigo utilizar a mesma sintaxe passando ao invés do nome da propriedade, o nome do método, veja abaixo.

[DebuggerDisplay("X={X} Y={Y} Soma dos valores = {SomarValores()}")]
class Posicao
{
    public int X { get; set; }
    public int Y { get; set; }

    public int SomarValores()
    {
        return X + Y;
    }
}

DebuggerDisplay04

Muito simples e útil, colocando um simples atributo, consigo definir valores úteis, que ajudem na hora da depuração do projeto.

Para finalziar, o atributo não está limitado a classes, posso utilizar com.

  • Classes
  • Structs
  • Delegates
  • Enumeradores
  • Campos
  • Propriedades
  • Assemblies

Abraços e até o próximo post.

  • http://www.feliperaymundo.com.br Felipe Pedroti Raymundo

    Muito legal, uma maneira bem simples e elegante de mostrar os valores, não tendo que ficar caçando entre os tipos ^^

  • http://rafaelamorim.co.cc Rafael Amorim

    Show!

    Sinceramente não conhecia este recurso!

    Continue com estas dicas que estão ajudando muito! :)

    Valeu!

    []‘s
    faelAmorim

  • http://gesilenemartins.wordpress.com Gesilene Martins

    Olá Márcio!

    Excelente post, com certeza existem muitas pessoas que não conhecem este recurso.

    Parabéns!!!

  • Juliano Pezzini

    Bah, e depois o pessoal fica reclamando que o Visual Studio é muito pesado pra debugar! hehe

    • http://www.marcioalthmann.net Márcio Fábio Althmann

      heueheuheu pois é :D

  • Oops Twitter isnt working at the moment