gpt4 book ai didi

c# - #if DEBUG 与条件 ("DEBUG")

转载 作者:IT王子 更新时间:2023-10-29 03:27:39 26 4
gpt4 key购买 nike

在大型项目中哪个更好用,为什么:

#if DEBUG
public void SetPrivateValue(int value)
{ ... }
#endif

[System.Diagnostics.Conditional("DEBUG")]
public void SetPrivateValue(int value)
{ ... }

最佳答案

这真的取决于你要做什么:

  • #if DEBUG:此处的代码甚至不会在发布时到达 IL。
  • [Conditional("DEBUG")]:此代码将到达 IL,但是对该方法的调用将被省略,除非在编译调用程序时设置了 DEBUG .

我个人根据情况使用两者:

有条件的(“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 通信设置不同的绑定(bind)时使用它。

#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");
}

当库针对 Release模式(即没有 DEBUG 符号)编译时,它将永远省略 A() 中对 B() 的调用,即使如果包含对 A() 的调用,因为 DEBUG 是在调用程序集中定义的。

关于c# - #if DEBUG 与条件 ("DEBUG"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3788605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com