需要.NET代码仅在调试配置下执行

43

我有一些代码可以访问网络上的API。其中一个API参数允许我告诉他们我正在进行测试。

当我测试时,我想在我的代码中仅设置此参数。目前,我只是在发布构建时将代码注释掉。

是否有一种基于构建配置自动执行此操作的方法?

8个回答

114

解决方案

您可以使用以下方法之一 —

1: Conditional 属性

Conditional 属性向编译器指示,除非定义了指定的条件编译符号,否则应忽略方法调用或属性。

代码示例:

[Conditional("DEBUG")]
static void Method() { } 

1b: C# 9中的本地函数Conditional属性

自C# 9起,您可以在本地函数上使用属性。

代码示例:

static void Main(string[] args)
{
    [Conditional("DEBUG")]
    static void Method() { }

    Method();
}

2: #if 预处理器指令

当 C# 编译器遇到一个#if预处理器指令,最终跟随着一个 #endif 指令,它只会编译指定符号被定义时间代码。与 C 和 C++ 不同,你不能为符号赋一个数值。在 C# 中,#if 语句是布尔类型的,并且只测试符号是否已定义。

代码示例:

#if DEBUG
    static int testCounter = 0;
#endif 

3: Debug.Write 方法

Debug.Write(以及 Debug.WriteLine)将有关调试的信息写入到 Listeners 集合中的跟踪侦听器。

另请参阅 Debug.WriteIfDebug.WriteLineIf

代码示例:

Debug.Write("Something to write in Output window.");

注意事项

注意不要使用#if指令,因为它可能会在非Debug(例如Release)构建中产生意外情况。例如,请参见:

    string sth = null;
#if DEBUG
    sth = "oh, hi!";
#endif
    Console.WriteLine(sth);
在此情况下,非调试版本将打印空消息。但是,在其他情况下,这可能会引发 NullReferenceException

阅读更多

另请参阅

还有一个工具,DebugView,可以从外部应用程序捕获调试信息。


那些 Debug.WriteXXX 方法也被标记为 [Conditional("DEBUG")] - zwcloud
1
赞扬您在过去的10年中一直更新此答案 :) - Matt Jenkins

33
是的,请将代码放在标签中。
#if DEBUG
// do debug only stuff 
#else
// do non DEBUG stuff
#endif

在 Google 中搜索 "C# 编译符号"

当你处于调试配置时,Visual Studio 会自动定义 DEBUG。你可以定义任何你想要的符号(查看项目属性,生成选项卡)。请注意,滥用预处理指令是一个坏主意,它可能导致代码难以阅读/维护。


你能举个滥用的例子吗? - Ronnie Overby
1
我曾经参与过这样一个项目: #if VERSION_1_1 // 版本 1.1 的特殊操作 #elif VERSION_2_0 #if INCLUDE_FLASH // flash 特定的操作 #elif HTML_RENDERER // HTML 特定的操作 #else /// 等等 #endif虽然这只是一段注释,并且无法正确格式化,但你可以理解其中的意思。他们选择这种方式来维护不同版本。这足够让人想要疯掉。 - Matt Greer
啊,谢谢建议。我并不想做那样的事情。我认为在那种情况下,使用源代码控制来进行分支可能会更好。 - Ronnie Overby

16

我曾经遇到过同样的问题,而我采用的解决方案是使用:

if (System.Diagnostics.Debugger.IsAttached)
{
    // Code here
}

这意味着在生产环境中,你可以技术上附加调试器并使那段代码运行。


7
除了#if #endif指令外,您还可以使用条件属性。如果您使用该属性标记一个方法
[Conditional("Debug")]

只有在调试模式下构建应用程序时,它才会被编译和运行。正如下面的评论所指出的那样,这些仅在方法具有 void 返回类型时起作用。


5

以下是类似结果的另一篇文章: http://www.bigresource.com/Tracker/Track-vb-lwDKSoETwZ/

更好的解释请参见:http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx

// preprocessor_if.cs
#define DEBUG
#define MYTEST
using System;
public class MyClass 
{
    static void Main() 
    {
#if (DEBUG && !MYTEST)
        Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && MYTEST)
        Console.WriteLine("MYTEST is defined");
#elif (DEBUG && MYTEST)
        Console.WriteLine("DEBUG and MYTEST are defined");
#else
        Console.WriteLine("DEBUG and MYTEST are not defined");
#endif
    }
}

2
以下内容可安全使用:
var isDebug = false;
#if DEBUG
    isDebug = System.Diagnostics.Debugger.IsAttached;
#endif

if (isDebug) {
    // Do something
}

2
public int Method ()
{
#if DEBUG 
   // do something 
#endif
}

0

这适用于asp.net:

if (System.Web.HttpContext.Current.IsDebuggingEnabled)
    //send email to developer;
else
    //send email to customer;

来自Rick Strahl @ 检测ASP.NET调试模式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接