NDoc: How to Make Good Use of Your XML Comments?

NDoc: How to Make Good Use of Your XML Comments?

** Writen by Allen Lee **

** Requirement **

  • 使用C#进行库的开发。
  • 在源代码里使用XML注释。
  • 厌倦额外的文档编制工作,希望有无怨无悔的电脑接手这份枯燥无味的工作。
  • 具备C#的开发条件,至少需要.NET Framework SDK 1.1。
  • 能尽量抑制你的瞌睡虫,不让它阻碍你阅读本文。
  • 其它...

** Encountered Problems **

  • 面向对象技术的普及,为我们带来了极大的便利。对象的重用减轻了我们编码时许多不必要的痛苦,清晰的代码责任分离制免除了我们每顿都要面对着“意大利粉”的厌恶。
  • 但是,我们仍然要面对着枯燥的文档编制——从内容构思到页面排版。相信库开发人员对这种厌恶已经深有感触,即使我们都承认文档的重要性。 当然,某些大企业有专人写文档,但最了解库的却是程序员自己!而程序员往往又会在自己开发的库中为代码添加注释,如果有个工具能够利用这些注释按照一定的格式要求直接导出文档该多好呀!
  • 聪明而“懒惰”的程序员总是比其他人先行一步,他们不愿把自己放进重复而枯燥的方框内,他们千方百计要跳出这个方框,让自己能够从事更富创造性的活动,把这些枯燥无味的扔给无怨无悔的电脑们。

** Feel Free to Write Your Class Library With XML Comments Added **

  • 单纯的文字无法让你领略NDoc的魅力,至少我还没有这个能力。睡着了吗?(或许周公的故事更加有趣!)还没有的话请看看下面这段示范代码——一个表示复数的类(class)。

using System;
using System.Globalization;

namespace MathUtils
{
/**/ ///

1<summary>   
2![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) ///  提供复数的相关操作服务。   
3![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif) ///  </summary>

public sealed class Complex
{
/**/ ///

1<summary>   
2![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) ///  默认构造器,将复数的实部与虚部分别设置为0;   
3![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif) ///  </summary>

public Complex()
{
_Real = 0 ;
_Imaginary = 0 ;
}

/**/ ///

1<summary>   
2![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) ///  分别将复数的实部与虚部设置为指定的值。   
3![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) ///  </summary>

///

1<param name="real"/>

///

1<param name="imaginary"/>

public Complex( int real, int imaginary)
{
_Real = real;
_Imaginary = imaginary;
}

private int _Real;
/**/ ///

1<summary>   
2![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) ///  复数的实部。   
3![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif) ///  </summary>

public int Real
{
get
{
return _Real;
}
set
{
_Real = value;
}
}

private int _Imaginary;
/**/ ///

1<summary>   
2![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) ///  复数的虚部。   
3![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif) ///  </summary>

public int Imaginary
{
get
{
return _Imaginary;
}
set
{
_Imaginary = value;
}
}

/**/ ///

1<summary>   
2![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) ///  把复数转换为对应的字符串形式。   
3![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) ///  </summary>

///

1<returns>   
2![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) ///  返回(X)+(Y)i的形式的字符串。   
3![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif) ///  </returns>

public override string ToString()
{
return String.Format(CultureInfo.InvariantCulture,
" {0} + {1}i " ,
_Real,
_Imaginary);
}

}
}

** Generate Your XML Comments to A Seperate XML File **

  • 如果你有Visual C# .NET,那么你可以轻松的使用一下的步骤:在解决方案管理器中右键单击该项目图标,依次选择 属性 | 配置属性 | 生成,在 [输出] 的 [XML 文档文件] 右边填入目标XML文件的文件名,这里是Complex.xml。保存设置并关闭该对话框,生成该项目,你将会在项目的根目录中找到这个XML文件。

  • 没有Visual C# .NET?没所谓,用C#的命令行编译器CSC.exe也可以。只需要在源代码所在的目录的命令提示符下键入csc Complex.cs /doc:Complex.xml
 1<enter>,就可以生成XML注释文件了。 
 2  * 好了,现在来看看我们第一阶段的劳动成果: 
 3
 4
 5
 6![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) <?  xml version="1.0" encoding="utf-8"  ?>   
 7![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; doc  &gt;   
 8![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; assembly  &gt;   
 9![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; name  &gt; Complex     
10![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
11![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; members  &gt;   
12![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; member  name  ="T:MathUtils.Complex"  &gt;   
13![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; summary  &gt;   
14![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) 提供复数的相关操作服务。   
15![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
16![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
17![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; member  name  ="M:MathUtils.Complex.#ctor"  &gt;   
18![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; summary  &gt;   
19![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) 默认构造器,将复数的实部与虚部分别设置为0;   
20![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
21![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
22![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; member  name  ="M:MathUtils.Complex.#ctor(System.Int32,System.Int32)"  &gt;   
23![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; summary  &gt;   
24![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) 分别将复数的实部与虚部设置为指定的值。   
25![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
26![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; param  name  ="real"  &gt;   
27![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; param  name  ="imaginary"  &gt;   
28![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
29![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; member  name  ="M:MathUtils.Complex.ToString"  &gt;   
30![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; summary  &gt;   
31![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) 把复数转换为对应的字符串形式。   
32![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
33![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; returns  &gt;   
34![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) 返回(X)+(Y)i的形式的字符串。   
35![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
36![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
37![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; member  name  ="P:MathUtils.Complex.Real"  &gt;   
38![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; summary  &gt;   
39![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) 复数的实部。   
40![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
41![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
42![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; member  name  ="P:MathUtils.Complex.Imaginary"  &gt;   
43![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; summary  &gt;   
44![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) 复数的虚部。   
45![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
46![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
47![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)    
48![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) 
49
50** Where Is Our Protagonist?  **
51
52  * 现在是时候轮到这出戏的主角出场了—— NDoc 。接下来...下载...安装...启动NDoc...(是否人类总不能摆脱枯燥无味呢?)按下 [Add] 来添加你的Dll或Exe,以及与之相关联的XML注释文件。 
53
54
55
56![](http://blog.csdn.net/images/blog_csdn_net/allenlooplee/62266/o_AddFiles.JPG)
57
58  * 你希望NDoc用什么样的格式来生成库文档呢?哟,可供选择的类型也不少嘛!我们试试MSDN吧! 
59
60
61
62![](http://blog.csdn.net/images/blog_csdn_net/allenlooplee/62266/o_CommentType.JPG)
63
64  * 好了,万事俱备,只欠生成。Now build it! 
65
66
67
68![](http://blog.csdn.net/images/blog_csdn_net/allenlooplee/62266/o_Build.JPG)
69
70  * Well done! 这就是我们的第二阶段成果,也就是最终成果了!有没有觉得手痒想试一下呢? 
71
72
73
74![](http://blog.csdn.net/images/blog_csdn_net/allenlooplee/62266/o_DocSample.JPG)
75
76**Conclusion**
77
78  * 终于大结局啦,一百个人就有一百个哈姆雷特,不知道NDoc在你心目中是怎么一个形象呢? 
79  * 不知道你是否认为NDoc偏心,只对能使用XML Comments的C#这么好。然而,VB.NET也不需要感到难过,因为你有个 VBCommenter 在背后默默的支持你呢!</enter>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus