TIP: DebuggerDisplay

 ·  ☕ 2 min  ·  ✍️ eiximenis

    Nota: Este post ha sido importado de mi blog de geeks.ms. Es posible que algo no se vea del todo "correctamente". En cualquier caso puedes acceder a la versión original aquí

    Muy buenas! Acabo de leer el post de Luis Ruiz Pavon sobre sobre el sobreescribir .ToString() para mejorar la información del modo de depuración de VS.

    Y ya puestos, para complementar su post, quería comentar un truco que no se si conoce mucha gente y que permite algo parecido sin necesidad de sobreescribir ToString (que se usa para otras cosas además de para mostrar la información en la ventana de depuración) y que es el uso del atributo DebuggerDisplay.

    En este caso un ejemplo vale más que mil palabras:

    1.    [DebuggerDisplay ("Product {Name} ({Code}): {Description}")]
    2.     public class Product
    3.     {
    4.         public string Code { get; set; }
    5.         public string Name { get; set; }
    6.         public string Description { get; set; }
    7.         public Product(string code, string name, string description)
    8.         {
    9.             Code = code;
    10.             Name = name;
    11.             Description = description;
    12.         }
    13.         public override string ToString()
    14.         {
    15.             return String.Format("Code – {0}", Code);
    16.         }
    17.     }

    Y el resultado en la ventana de watches es:

    image

    Podemos conseguir cosas más interesantes utilizando las propiedades Name y TargetTypeName que modifican los valores de las columnas “Name” y “Type”. Así si uso el siguiente [DebuggerDisplay]:

    1. [DebuggerDisplay ("({Code}): {Description}", Name = "Product {Name}", Type ="Producto")]

    Veo lo siguiente en la ventana de watches:

    image

    Y en la ventana de Locals veo, ahora, lo siguiente:

    image

    El uso de DebuggerDisplay tiene sus limitaciones si se compara con redefinir ToString() (este último es un método y puede contener código como el que mostraba Luis en su post para convertir a JSON), mientras que DebuggerDisplay tan solo puede generar una pequeña cadena a partir de las propiedades.

    Si una clase tiene tanto ToString() redefinido como DebuggerDispay este último tiene precedencia para el depurador.

    ¡Y… eso es todo! 🙂

    Saludos!

    Si quieres, puedes invitarme a un café xD

    eiximenis
    ESCRITO POR
    eiximenis
    Compulsive Developer