清单 9.4 使用条件属性实现方法
1: #define DEBUG
2:
3: using System;
4:
5: class Info
6: {
7: [conditional("DEBUG")]
8: public static void Trace(string strMessage)
9: {
10: Console.WriteLine(strMessage);
11: }
12:
13: [conditional("DEBUG")]
14: public static void TraceX(string strFormat,params object[] list)
15: {
16: Console.WriteLine(strFormat, list);
17: }
18: }
19:
20: class TestConditional
21: {
22: public static void Main()
23: {
24: Info.Trace("Cool!");
25: Info.TraceX("{0} {1} {2}","C", "U", 2001);
26: }
27: }
在Info类中,有两个静态方法,它们根据DEBUG符号被有条件地编译:Trace,接收一个参数,而TraceX则接收n个参数。Trace的实现直接了当。然而,TraceX实现了一个你从没有见过的关键字:params.
params 关键字允许你指定一个方法参数,它实际上接收了任意数目的参数。其类似C/C++的省略参数。注意,它必须是方法调用的最后一个参数,而且在参数列表中,你只能使用它一次。毕竟,它们的局限性极其明显。
使用params 关键字的意图就是要拥有一个Trace方法,该方法接收一个格式字符串以及无数个置换对象。幸好,还有一个支持格式字符串和对象数组的 WriteLine方法(第16行)。
这个小程序产生的哪一个输出完全取决于DEBUG是否被定义。当DEBUG符号被定义时,方法都被编译和执行。如果DEBUG不被定义,对Trace和TraceX的调用也随之消失。
条件方法是给应用程序和组件增加条件功能的一个真正强大的手段。用一些技巧,你就可以根据由逻辑"或"(||)以及逻辑"与"(&&)连接起来的多个符号,生成条件方法。然而,对于这些方案,我想给你推荐C#文档。
9.2 在XML中的文档注释
很多程序员根本不喜欢的一项任务就是写作,包括写注释和写文档。然而,有了C#,你就找到改变老习惯的好理由:你可以用代码的注释自动生成文档。
由编译器生成的输出结果是完美的XML.它可以作为组件文档的输入被使用,以及作为显示帮助并揭示组件内部细节的工具。例如, Visual Studio 7 就是这样一种工具。
这一节专门为你说明如何最好地运用C#的文档功能。该例子涉及的范围很广,所以你不能有这样的借口,说它过于复杂,以至很难领会如何加入文档注释。文档是软件极其重要的一部分,特别是要被其他开发者使用的组件的文档。
在以下小节中,文档注解用来说明RequestWebPage 类。我已分别在以下几小节中做出解释:
。描述一个成员
。添加备注和列表
。提供例子
。描述参数
。描述属性
。编译文档
9.2.1 描述一个成员
第一步,为一个成员添加一个简单的描述。你可以用 <summary> 标签这样做:
/// <summary>This is …… </summary>
每一个文档注释起始于由三个反斜杠组成的符号"///".你可以把文档注释放在想要描述的成员之前:
/// <summary>Class to tear a Webpage from a Webserver</summary>
public class RequestWebPage
使用<para>和 </para>标签,为描述添加段落。用<see>标签引用其它已有了注释的成员。
/// <para>Included in the <see cref="RequestWebPage"/> class</para>
增加一个链接到RequestWebPage类的描述。注意,用于标签的语法是XML语法,这意味着标签大写化的问题,而且标签必须正确地嵌套。
当为一个成员添加文档时,另一个有趣的标签是<seealso> .它允许你描述可能使读者非常感兴趣的其它话题。
/// <seealso cref="System.Net"/>
前面的例子告诉读者,他可能也想查阅System.Net 名字空间的文档。你一定要给超出当前范围的项目规定一个完全资格名。
作为许诺,清单9.5 包含 RequestWebPage类中正在工作的文档的所有例子。看一下如何使用标签以及嵌套如何为组件产生文档。

