本教程演示条件方法,它们提供一种功能强大的机制,通过它可以根据是否定义了预处理器符号来包括或省略方法调用。 请参见“条件方法”示例以下载和生成本教程中讨论的示例文件。 条件方法使开发人员能够创建这样的方法,可将对这些方法的调用放在代码中,然后编译期间根据预处理符号包括或省略这些调用。 假定您想在调试版本中启用某些断言代码,而在发布版本中禁用它们。在 C++ 中,有不止一种方法可以将此功能包含到您的代码中,例如:
C# 条件方法为该问题提供了简单的解决方案,类似于上面列出的第一种方法。该操作有两个基本机制:
条件方法用于“.NET Framework”中。System.Diagnostics 命名空间包含许多支持应用程序中的跟踪和调试的类。使用 System.Diagnostics.Trace 和 System.Diagnostics.Debug 类向应用程序添加复杂的跟踪和调试(使用条件方法可从发布版本编译掉的功能)。 下面的示例展示如何使用条件方法实现非常简单的跟踪机制。System.Diagnostics.Trace 提供的跟踪机制复杂得多,但它使用下面的基本机制提供该功能。 本示例由两个源文件组成:第一个文件是提供跟踪机制的库,第二个文件是使用该库的客户程序。 下面的代码展示了一个简单的库,它提供向系统控制台显示跟踪消息的跟踪机制。客户可以将跟踪调用嵌入代码,然后可以通过在自己的编译阶段中定义符号来控制是否调用跟踪。 下面的代码行: 将 Message 方法标记为条件方法(通过 Conditional 属性)。Conditional 属性采用一个参数(预处理标识符),该标识符控制编译客户代码时是否包括方法调用。如果定义了预处理标识符,则调用方法;否则从不将调用插入客户代码。 关于哪些方法可以标记为条件方法存在一些限制;有关更多信息,请参见“C# 语言规范”中的 17.4.2 Conditional 属性。 下面的客户程序使用文件 #1 中定义的 Trace 类来执行一些简单跟踪。 编译客户代码时,根据是否定义了预处理标识符来决定在客户代码中是否包含条件代码。 用 /d:DEBUG 标志编译客户代码意味着编译器插入对 Trace 方法的调用。如果未定义该符号,则从不调用。 命令为: 给出以下输出: 命令为: 给出以下输出:示例文件
教程
示例
文件 #1:创建条件方法
// CondMethod.cs
// compile with: /target:library /d:DEBUG
using System;
using System.Diagnostics;
namespace TraceFunctions
{
public class Trace
{
[Conditional("DEBUG")]
public static void Message(string traceMessage)
{
Console.WriteLine("[TRACE] - " + traceMessage);
}
}
}
代码讨论
[Conditional("DEBUG")]
文件 #2:使用条件方法
// TraceTest.cs
// compile with: /reference:CondMethod.dll
// arguments: A B C
using System;
using TraceFunctions;
public class TraceClient
{
public static void Main(string[] args)
{
Trace.Message("Main Starting");
if (args.Length == 0)
{
Console.WriteLine("No arguments have been passed");
}
else
{
for( int i=0; i < args.Length; i++)
{
Console.WriteLine("Arg[{0}] is [{1}]",i,args[i]);
}
}
Trace.Message("Main Ending");
}
}
代码讨论
运行示例
tracetest A B C
[TRACE] - Main Starting
Arg[0] is [A]
Arg[1] is [B]
Arg[2] is [C]
[TRACE] - Main Ending
tracetest
[TRACE] - Main Starting
No arguments have been passed
[TRACE] - Main Ending