[C#] Sobreescribir ToString en nuestras clases para mejorar la información en modo depuración

Seguro que como yo muchas veces te has preguntado cual puede ser una razón para sobreescribir ToString en alguna clases, verdad?

Yo hace poco empecé a hacerlo para mejorar la información que recibo en modo depuración en Visual Studio de las listas, colecciones, enumerados

Ejemplo

Supongamos que partimos de la siguiente clase:

public class Product

{

    public string Code { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

 

    public Product(string code, string name, string description)

    {

        Code = code;

        Name = name;

        Description = description;

    }

}

Ahora vamos a crear una lista de productos:

class Program

{

    static void Main(string[] args)

    {

        var products = new List<Product>

        {

            new Product("XBOX1", "XBox One", "New generation of games and entertainment."),

            new Product("PS4", "Play Station 4", "New generation of games and entertainment."),

            new Product("WIIU", "Wii U", "New generation of games and entertainment.")

        };

    }

}

Y vamos a depurar este pequeño programa:

image

De un simple vistazo no podemos ver que contiene la lista de productos, solo que son del tipo PocNet.Product y que hay 3 y para ver que hay en cada uno deberíamos desplegar otro nivel:

image

El caso es que el intellisense de Visual Studio para mostrarnos esa información llama al método ToString de los objectos y por defecto nos muestra el tipo del objeto. Para modificar este comportamiento vamos a sobreescribir ToString y a mostrar el código del producto:

public class Product

{

    public string Code { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

 

    public Product(string code, string name, string description)

    {

        Code = code;

        Name = name;

        Description = description;

    }

 

    public override string ToString()

    {

        return String.Format("Code - {0}", Code);

    }

}

Depuramos la aplicación, y ya en el primer nivel podemos ver al menos el código del producto que me aporta más información que el tipo.

image

Y como plus, si quieres mostrar por ejemplo todos los elementos de la clase producto vamos a utilizar JSON.NET para que lo serialice a JSON:

public class Product

{

    public string Code { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

 

    public Product(string code, string name, string description)

    {

        Code = code;

        Name = name;

        Description = description;

    }

 

    public override string ToString()

    {

        return JsonConvert.SerializeObject(this);

    }

}

Depuramos, y ya tenemos una vista de todas las propiedades y sus valores en el primer nivel:

image

Un saludo y buen fin de semana a todos.

4 comentarios en “[C#] Sobreescribir ToString en nuestras clases para mejorar la información en modo depuración”

  1. Hola Luis,

    Yo la verdad es que siempre (y siempre significa rara vez) había utilizado el atributo DebuggerDisplay para ver información en depuración http://msdn.microsoft.com/en-us/library/system.diagnostics.debuggerdisplayattribute.debuggerdisplayattribute(v=vs.110).aspx

    De todas formas, me parece más acertado y limpio sobrescribir ToString porque es más fácil de recordar y más agnóstico. De hecho, he dicho de memoria el atributo DebuggerDisplay y espero no equivocarme… señal clara de que es mejor y más intuitivo ToString 😉

    Buen tip!!

    Un saludo.

  2. Luis, al igual que @panicoenlaxbox yo utilizo para esto el atributo DebuggerDisplay ya que el metodo ToString() es utilizado por la aplicacion
    A mi me parece mas acertado el DebuggerDisplay para estas cosas de debug

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *