我有一些代码可以访问网络上的API。其中一个API参数允许我告诉他们我正在进行测试。
当我测试时,我想在我的代码中仅设置此参数。目前,我只是在发布构建时将代码注释掉。
是否有一种基于构建配置自动执行此操作的方法?
我有一些代码可以访问网络上的API。其中一个API参数允许我告诉他们我正在进行测试。
当我测试时,我想在我的代码中仅设置此参数。目前,我只是在发布构建时将代码注释掉。
是否有一种基于构建配置自动执行此操作的方法?
您可以使用以下方法之一 —
Conditional
属性Conditional
属性向编译器指示,除非定义了指定的条件编译符号,否则应忽略方法调用或属性。
代码示例:
[Conditional("DEBUG")]
static void Method() { }
C# 9
中的本地函数Conditional
属性自C# 9起,您可以在本地函数上使用属性。
代码示例:
static void Main(string[] args)
{
[Conditional("DEBUG")]
static void Method() { }
Method();
}
#if
预处理器指令当 C# 编译器遇到一个#if
预处理器指令,最终跟随着一个 #endif 指令,它只会编译指定符号被定义时间代码。与 C 和 C++ 不同,你不能为符号赋一个数值。在 C# 中,#if 语句是布尔类型的,并且只测试符号是否已定义。
代码示例:
#if DEBUG
static int testCounter = 0;
#endif
Debug.Write
方法Debug.Write
(以及 Debug.WriteLine
)将有关调试的信息写入到 Listeners 集合中的跟踪侦听器。
另请参阅 Debug.WriteIf
和 Debug.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,可以从外部应用程序捕获调试信息。
#if DEBUG
// do debug only stuff
#else
// do non DEBUG stuff
#endif
在 Google 中搜索 "C# 编译符号"
当你处于调试配置时,Visual Studio 会自动定义 DEBUG
。你可以定义任何你想要的符号(查看项目属性,生成选项卡)。请注意,滥用预处理指令是一个坏主意,它可能导致代码难以阅读/维护。
#if VERSION_1_1 // 版本 1.1 的特殊操作 #elif VERSION_2_0 #if INCLUDE_FLASH // flash 特定的操作 #elif HTML_RENDERER // HTML 特定的操作 #else /// 等等 #endif
虽然这只是一段注释,并且无法正确格式化,但你可以理解其中的意思。他们选择这种方式来维护不同版本。这足够让人想要疯掉。 - Matt Greer我曾经遇到过同样的问题,而我采用的解决方案是使用:
if (System.Diagnostics.Debugger.IsAttached)
{
// Code here
}
这意味着在生产环境中,你可以技术上附加调试器并使那段代码运行。
[Conditional("Debug")]
只有在调试模式下构建应用程序时,它才会被编译和运行。正如下面的评论所指出的那样,这些仅在方法具有 void 返回类型时起作用。
以下是类似结果的另一篇文章: 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
}
}
var isDebug = false;
#if DEBUG
isDebug = System.Diagnostics.Debugger.IsAttached;
#endif
if (isDebug) {
// Do something
}
public int Method ()
{
#if DEBUG
// do something
#endif
}
这适用于asp.net:
if (System.Web.HttpContext.Current.IsDebuggingEnabled)
//send email to developer;
else
//send email to customer;
来自Rick Strahl @ 检测ASP.NET调试模式
Debug.WriteXXX
方法也被标记为[Conditional("DEBUG")]
。 - zwcloud