Estoy seguro que nadie ha escrito un programa que a la primera salga bien, y también estoy seguro de que para corregir los errores en los tuyos has tenido que debuguear el código. En este post te voy a dar algunos tips para que depures tu código en C# y tu IDE de confianza.

Directivas de preprocesamiento

Primero comencemos por la directiva de preprocesamiento #if y el símbolo DEBUG. Si envuelves cualquier parte de código entre un if DEBUG y #endif únicamente será compilado cuando el símbolo en cuestión esté definido. Si estás usando un IDE es muy común que DEBUG esté definido cuando estás usando la configuración Debug de tu proyecto.

#if DEBUG
Console.WriteLine("Solo visible en modo debug, directiva: DEBUG");
#endif

Sobreescribir el método ToString

Otra de las cosas que puedes hacer es sobreescribir el método ToString en tus clases, ya que por default, C# regresará el nombre calificado del tipo que estamos llamando. Si, por ejemplo, hubiéramos sobreescrito el método en nuestra clase TestClass de la siguiente manera:

public class TestClass
{
    public string Propiedad1 { get; set; }
    public override string ToString()
    {
        return string.Format("{0}:{1}", nameof(Propiedad1), Propiedad1);
    }

Al llamar al método Console.WriteLine de la siguiente manera:

Console.WriteLine(tc);

Hubiéramos obtenido lo siguiente:

Sin sobreescribir ToString ```csharp DebuggingTips.TestClass ```
Sobreescribiendo ToString ```csharp Propiedad1: Uno ```

Atributo DebuggerDisplay

Existe una falla con usar ToString... y es que esta es una modificación que afectará a toda nuestra aplicación, aún cuando no estemos depurando el código. Para solucionarlo, podemos comentar ese código cuando ya no estemos depurando o envolver la sobreescritura en un #if DEBUG.

Pero bueno, las dos opciones suenan un poco mal. Si tu aplicación no tiene alguna forma de escribir en pantalla y únicamente vas a depurar en el IDE, puedes hacer uso del atributo DebuggerDisplay

[DebuggerDisplay("Propiedad1: {Propiedad1}")]
public class TestClass

Que en pocas palabras, le dirá a nuestro entorno de desarrollo cómo debe mostrar los tipos de dato cuando estemos debugueando:

Métodos de la clase Diagnostics.Debug

Otra de las opciones que tenemos (y que yo descubrí recientemente) es la clase Debug en el namespace System.Diagnostics.

Primero, no siempre vas a estar programando aplicaciones que tengan una consola disponible, entonces no siempre vas a poder usar la clase Console, es aquí cuando podemos usar:

System.Diagnostics.Debug.WriteLine(tc + "// Debug.WriteLine ");

Que como puedes ver, es muy parecido al método que ya conoces. Con la diferencia de que este escribe a otro flujo de datos. En tu entorno de desarrollo generalmente lo podrás ver en la ventana de Salida de la aplicación o Application output:

Hay ocasiones en las que solamente deseamos saber si una o varias condiciones se cumpliero, y pareciera que ese es trabajo para la sentencia de control if. O, podrías usar el método WriteLineIf si el valor enviado como primer parámetro es verdadero. Está de más decir que podemos llamar a ejecutar una función ahí dentro:

System.Diagnostics.Debug.WriteLineIf(tc.Propiedad1.Equals("Dos"), tc);

En este post únicamente hablé del método WriteLine y WriteLineIf, pero tienes que saber que esta clase tiene muchas más características.

En futuros posts estaré hablando de más tips para depurar usando Visual Studio y Xamarin Studio, así que no olvides suscribirte para estar enterado.