这真的取决于你的目标:
-
#if DEBUG:这里的代码在发布时甚至不会到达 IL。
-
[Conditional("DEBUG")]:此代码将到达 IL,但是对方法的 调用 将被省略,除非在编译调用者时设置了 DEBUG。
我个人根据情况使用两者:
Conditional("DEBUG") 示例: 我使用它是为了在发布期间不必返回并编辑我的代码,但在调试期间我想确保我没有不要打错字。此函数会检查我在尝试在 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));
}
您真的不想使用#if DEBUG 创建函数,除非您愿意用相同的#if DEBUG 包装对该函数的每次调用:
#if DEBUG
public void DoSomething() { }
#endif
public void Foo()
{
#if DEBUG
DoSomething(); //This works, but looks FUGLY
#endif
}
对比:
[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 示例:我在尝试为 WCF 通信设置不同的绑定时使用它。
#if DEBUG
public const String ENDPOINT = "Localhost";
#else
public const String ENDPOINT = "BasicHttpBinding";
#endif
在第一个示例中,代码全部存在,但除非打开 DEBUG,否则将被忽略。在第二个示例中,const ENDPOINT 设置为“Localhost”或“BasicHttpBinding”,具体取决于是否设置了 DEBUG。
更新:我正在更新此答案以澄清一个重要且棘手的问题。如果您选择使用ConditionalAttribute,请记住在编译期间会省略调用,并且不是运行时。那就是:
MyLibrary.dll
[Conditional("DEBUG")]
public void A()
{
Console.WriteLine("A");
B();
}
[Conditional("DEBUG")]
public void B()
{
Console.WriteLine("B");
}
当库在发布模式下编译时(即没有 DEBUG 符号),它将永远忽略从 A() 中对 B() 的调用,即使包含对 A() 的调用,因为 DEBUG 定义在调用程序集。