in C#

Dica: C# Debugger Display Attributes

Desenvolver classes e métodos com nomes que realmente expressem o que aquela estrutura faz é responsabilidade do nosso dia a dia como desenvolvedor. Porém em alguns cenários o debug de um código pode ser facilitado com o uso de Debugger Display Attributes, com eles é possível configurar como o objeto será exibido durante o debug, para isso vamos utiliza a namespace System.Diagnostics.

DebuggerDisplayAttribute

Com este atributo é possível configurar tanto o nome que a classe aparecerá no debug, como acessar algumas propriedades do objeto.

Exemplo, sem o DebuggerDisplay:

using System.Console;

namespace ConsoleApplication3
{
    public class LivroDB
    {
        public string Titulo { get; set; }
        public string Autor { get; set; }
    }
}

image

Exemplo, com o DebuggerDisplay:

using System.Console;
using System.Diagnostics;

namespace ConsoleApplication3
{
    [DebuggerDisplay("Livro: {Titulo} - {Autor}")]
    //[DebuggerDisplay("Livro")]
    public class LivroDB
    {
        public string Titulo { get; set; }
        public string Autor { get; set; }
    }
}

image

DebuggerBrowsableAttribute

Com este tipo de atributo é possível configurar em um campo ou propriedade a maneira em que ele será mostrado no debug, este atributo é utilizado com um enum que especifica qual estado está sendo utilizado:

  • Never, utilizado para um membro que não deve ser mostrado no debug.
  • Collpsed, utilizado para que a propriedade (list, array, etc) não seja expandida no debug por padrão.
  • RootHidden, utilizado quando o nome da propriedade em si não é mostrada, mas sim a lista de objetos que a compões.

Exemplo de uso com o RootHidden, notem que os itens da lista de Tags são mostrados de uma maneira sem que seja necessário expandir o Root:

using System.Collections.Generic;
using System.Console;
using System.Diagnostics;

namespace ConsoleApplication3
{
    public class LivroDB
    {
        public string Titulo { get; set; }
        public string Autor { get; set; }
        
        [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
        public List<string> Tags { get; set; }
    }
}

image

DebuggerTypeProxy

Este atributo serve para quando precisamos mudar de uma maneira bem drástica a maneira como um objeto é exibido durante o debug.

Exemplo:

using System.Collections.Generic;
using System.Console;
using System.Diagnostics;

namespace ConsoleApplication3
{
    [DebuggerTypeProxy(typeof(LivroView))]
    public class LivroDB
    {
        private const string Teste = "não deve aparecer no debug window.";

        public string Titulo { get; set; }
        public string Autor { get; set; }
        [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
        public List<string> Tags { get; set; }

        internal class LivroView
        {
            public const string TesteProxy = "deve aparecer no debug window.";

            private LivroDB livrodb;

            public LivroView(LivroDB livro)
            {
                this.livrodb = livro;
            }
        }
    }
}

image

Bom espero que este post seja útil, estou a disposição para dúvidas, críticas e sugestões.

abs

Rodolfo

  • Kevin Allen

    Interessante, desconhecia esses atributos do Debug.