Realmente depende de lo que vamos a dar:
#if DEBUG
: El código aquí ni siquiera llegará a IL en el lanzamiento.
[Conditional("DEBUG")]
: Este código llegará a la IL; sin embargo, llamadas al método se omitirán a menos que DEBUG se establezca cuando la persona que llama se compila.
Personalmente utilizo ambos, dependiendo de la situación:
condicional ("Test") Ejemplo: Puedo utilizar esto para que yo no tengo que volver atrás y editar mi código más tarde durante la liberación, pero durante la depuración quiero asegurarme de no haber cometido errores tipográficos. Esta función comprueba que escribo un nombre de propiedad correctamente cuando trato de usarlo en mi material INotifyPropertyChanged.
[Conditional("DEBUG")]
[DebuggerStepThrough]
protected void VerifyPropertyName(String propertyName)
{
if (TypeDescriptor.GetProperties(this)[propertyName] == null)
Debug.Fail(String.Format("Invalid property name. Type: {0}, Name: {1}",
GetType(), propertyName));
}
Realmente no desea crear una función utilizando #if DEBUG
menos que esté dispuesto para envolver cada llamada a la función con el mismo #if DEBUG
:
#if DEBUG
public void DoSomething() { }
#endif
public void Foo()
{
#if DEBUG
DoSomething(); //This works, but looks FUGLY
#endif
}
frente:
[Conditional("DEBUG")]
public void DoSomething() { }
public void Foo()
{
DoSomething(); //Code compiles and is cleaner, DoSomething always
//exists, however this is only called during DEBUG.
}
#if DEBUG ejemplo: Lo uso cuando trato de configurar diferentes enlaces para la comunicación WCF.
En el primer ejemplo, el código existe, pero se ignora a menos que DEBUG esté activado. En el segundo ejemplo, la const ENDPOINT se establece en "Localhost" o "BasicHttpBinding" dependiendo de si DEBUG está configurado o no.
Actualización: Debido a que esta respuesta es la más alta votaron respuesta a la pregunta, estoy actualizando esta respuesta para aclarar un punto importante y difícil. Si elige usar el ConditionalAttribute
, tenga en cuenta que las llamadas se omiten durante la compilación y no en el tiempo de ejecución. Es decir:
MyLibrary.dll
[Conditional("DEBUG")]
public void A()
{
Console.WriteLine("A");
B();
}
[Conditional("DEBUG")]
public void B()
{
Console.WriteLine("B");
}
Cuando la biblioteca se compila contra el modo de liberación (es decir, sin símbolos de depuración), será siempre tienen la llamada a B()
desde dentro A()
omitido, incluso si una llamada a A()
está incluido porque DEBUG se define en el conjunto de llamadas.
Ver http://blogs.msdn.com/b/ericlippert/archive/2009/09/10/what-s-the- difference-between-conditional-compilation-and-the-conditional-attribute.aspx para algunas reflexiones sobre esta cuestión. –
puede usar esto también: if (Debugger.IsAttached) {...} – sofsntp