martes, 4 de abril de 2017

System.Diagnostics Acciones Útiles






The namespace System.Diagnostics provides a set of attributes and classes to interact with the system process, events managers, performance counts, etc. This namespace can help us too in debugging job.

Let’s review the useful actions inside of System.Diagnostics namespace. 









DebuggerDisplay Attribute

DebuggerDisplay attribute marca el formato string format en la ventana del depurador de Visual Studio en: clasespropiedades campos.

Para esta misma tarea es conocida por todos la sobrecarga del método ToString , pero usar el atributo DebbugerDisplay es una mejor elección, ya que no modifica la estructura de los datos y solo interactúa con la ventana de debug de Visual Studio. 

Realizar la sobrecarga del método ToString, para este propósito, puede plantear una serie de problemas accarreados por las llamadas automáticas del CLR a este método, como en los  bindings de WPF.

Este atributo es compatible con delegatespropertiesfields y assamblies

Ejemplo:

[System.Diagnostics.DebuggerDisplay("{ID} - {Model}- {Manufacturer} - {ProductionDate}")]
public class Car
{
    public int      ID             { get; set; }
    public string   Model    { get; set; }
    public string   Manufacturer   { get; set; }
    public DateTime ProductionDate { get; set; }
}













DebuggerHidden Attribute

El atributo DebuggerHidden impide al compilador parar en constructores, métodos, propiedades y indexadores.

De primeras esto no parece demasiado útil, pero en la práctica puede ahorrarnos tiempo y unas cuantas pulsaciones menos a la tecla F11 .

Ejemplo:

[System.Diagnostics.DebuggerHidden]
public static List<Car> GetData()
{
    var result = new List<Car>()
    {
        new Car{ ID = 1, Manufacturer = "Ford",   Model = "Mustang", ProductionDate = DateTime.Today },
        new Car{ ID = 2, Manufacturer = "Nissan", Model = "Micra"  , ProductionDate = DateTime.Today }
    };

    return result;
}




Debugger.Launch

En ocasiones no tenemos posiblidad de pododer debugear el código de una librería, un servicio, o un componente, ya que no hay forma de adjuntarlo a nuestra solución. El método Debugger.Launch() , nos ofrece esa ventaja, ya que cuando la ejecución del código llega a su linea, esta lanza un ventana de Debug de Visual Studio,  proponiendonos la posibilidad de depurar el código.



























































Cuando ejecutamos la línea Systen.Diagnostics.Debbuger.Launch(), se abrirá MessageBox dándonos a elegir las opciones de instancia de debug de  Visual Studio :

























En esta ventana podremos elegir entre crear una nueva instancia de las versiones de Visual Studio que tengamos instaladas en la máquina, o reutilizar una de las que ya tengamos abierta.

Y ya podremos debugear el código:






























Conditional Attribute

El atributo Conditional, permite indicar una condición a métodos, para que el compilador ejecute o no ejecute su contenido.

Lo podemos utilizar con sentencias de precompilación como  DEBUG.

static void Main(string[] args)
{

    DebugMethod();


    Console.Read();
}

[System.Diagnostics.Conditional("DEBUG")]
public static void DebugMethod()
{
    Console.WriteLine("Execute Debug Method");
}



Como se puede apreciar, el método solo se ejecuta si estamos en DEBUG.

No existe ninguna condición para RELEASE, pero este atributo nos ofrece la potencia de utilizar directivas DEFINE.

Las directivas DEFINE son otra de las opciones de System.Diagnostics.Conditional:

using System;
namespace SystemDiagnosticsUsefulActions
{
    class Program
    {
        static void Main(string[] args)
        {
            ReleaseMethod();

            Console.Read();
        }

        [System.Diagnostics.Conditional("RELEASE_MODE")]
        public static void ReleaseMethod()
        {
            Console.WriteLine("Execute Release Method");
        }

    }

}






Estos son algunos de las acciones útilies de  System.Diagnostics. Pueden llegar a ser bastante prácticas, espero que lo sean para todos vosotros.