使用.NET中的XML注释(一) -- XML注释标签讲解

一.摘要

  .Net允许开发人员在源代码中插入XML注释,这在多人协作开发的时候显得特别有用。 C#解析器可以把代码文件中的这些XML标记提取出来,并作进一步的处理为外部文档。 这篇文章将展示如何使用这些XML注释。 在项目开发中,很多人并不乐意写繁杂的文档。但是,开发组长希望代码注释尽可能详细;项目规划人员希望代码设计文档尽可能详尽;测试、检查人员希望功能说明书尽可能详细等等。如果这些文档都被要求写的话,保持它们同步比进行一个战役还痛苦。

  为何不把这些信息保存在一个地方呢??最明显想到的地方就是代码的注释中;但是你很难通览程序,并且有些需要这些文档的人并不懂编码。最好的办法是通过使用XML注释来解决这些问题。代码注释、用户手册、开发人员手册、测试计划等很多文档可以很方便的从XML注释中获得。本文讲解.Net中经常使用的XML注释.主要使用C#语言j,.Net平台支持的其他语言使用的XML注释格式基本相同.并且在本系列文章的下一讲中讲解如何使用工具将XML注释内容转化为帮助文档.

  二.XML注释概述

  所有的XML注释都在三个向前的斜线之后(///)。两条斜线表示是一个注释,编译器将忽略后面的内容。三条斜线告诉编译器,后面是XML注释,需要适当地处理。

  当开发人员输入三个向前的斜线后,Microsoft Visual Studio .NET IDE 自动检查它是否在类或者类成员的定义的前面。如果是的话,Visual Studio .NET IDE 将自动插入注释标记,开发人员只需要增加些额外的标记和值。下面就是在成员函数前增加三个斜线,自动增加的注释比如:

  /// <summary>
    /// 得到指定酒店的酒店信息
    /// </summary>
    /// <param name="hotelId">酒店Id</param>
    /// <param name="languageCode">语言码.中文为zh-cn</param>
    /// <returns>酒店信息对象</returns>
    [OperationContract]
    OutHotelInfo GetHotelInfoByHotelId(string loginName, string loginPassword, string hotelId, string languageCode);

  这里嵌入的summary,param,returns标记仅仅是Visual Studio能够识别的一部分标记,然而在智能感知IntelliSense中,并没有把c#规范中所有的标记列出来,遗失的部分只能用手工插入。 这些手工标记是非常有用的,如果恰当地设置他们,对导出成外部说明文件将非常有帮助。

  三.将注释生成XML文件

  在代码中添加的注释信息, 可以单独提取出来, 生成XML文件. 在制作最后的帮助文件的时候会使用到这些注释XML文件.

  默认情况下是不生成注释XML文件的.每个项目可以生成一个XML文件,需要我们在项目属性中进行设置:

使用.NET中的XML注释(一) -- XML注释标签讲解

  如上图所示,在项目的"属性页"->"生成"中, 勾选"XML文档文件"复选框,即可在编译时生成注释XML文件.生成路径默认是和dll文件在同一个文件夹下,也可以自行修改.注意此处填写的是相对路径.

  四.常见注释标签列表

  注释的使用很简单,但是我们使用到的注释很少.这是因为大部分项目中注释的作用仅仅是给程序员自己看.如果想要生成类似MSDN这样的文档,我们需要了解更多的注释标签.下面是我整理的常用的注释标签:

标签名称说明语法参数
<summary><summary> 标记应当用于描述类型或类型成员。使用 <remarks> 添加针对某个类型说明的补充信息。

 

  <summary> 标记的文本是唯一有关 IntelliSense 中的类型的信息源,它也显示在 对象浏览器 中。

<summary>

 

  Description

  </summary>

description:对象的摘要。
<remarks>使用 <remarks> 标记添加有关类型的信息,以此补充用 <summary> 指定的信息。此信息显示在对象浏览器中。<remarks>

 

  Description

  </remarks>

description:成员的说明。
<param><param> 标记应当用于方法声明的注释中,以描述方法的一个参数。

 

  有关 <param> 标记的文本将显示在 IntelliSense、对象浏览器和代码注释 Web 报表中。

<param name='name'>

 

  description

  </param>

name:方法参数名。将此名称用双引号括起来 (" ")。

 

  description:参数说明。

<returns><returns> 标记应当用于方法声明的注释,以描述返回值。<returns>

 

  Description

  </returns>

description:返回值的说明。
<value><value> 标记使您得以描述属性所代表的值。请注意,当在 Visual Studio .NET 开发环境中通过代码向导添加属性时,它将会为新属性添加 <summary> 标记。然后,应该手动添加 <value> 标记以描述该属性所表示的值。<value>

 

  property-description

  </value>

property-description:属性的说明
<example>使用 <example> 标记可以指定使用方法或其他库成员的示例。这通常涉及使用 <code> 标记。<example>

 

  Description

  </example>

description: 代码示例的说明。
<c><c> 标记为您提供了一种将说明中的文本标记为代码的方法。使用 <code> 将多行指示为代码。<c>

 

  Text

  </c>

text :希望将其指示为代码的文本。
<code>使用 <code> 标记将多行指示为代码。使用<c>指示应将说明中的文本标记为代码。<code>

 

  Content

  </code>

content:希望将其标记为代码的文本。
<exception><exception> 标记使您可以指定那些异常可被引发。此标记可用在方法、属性、事件和索引器的定义中。<exception

 

  cref="member">

  Description

  </exception>

cref:

 

  对可从当前编译环境中获取的异常的引用。编译器检查到给定异常存在后,将 member 转换为输出 XML 中的规范化元素名。必须将 member 括在双引号 (" ") 中。

  有关如何创建对泛型类型的 cref 引用的更多信息,请参见 <see>

  description:异常的说明。

<see>

 

  <seealso>

<see> 标记使您得以从文本内指定链接。使用 <seealso> 指示文本应该放在“另请参见”节中。<see cref="member"/>cref:

 

  对可以通过当前编译环境进行调用的成员或字段的引用。编译器检查给定的代码元素是否存在,并将 member 传递给输出 XML 中的元素名称。应将 member 放在双引号 (" ") 中。

<para><para> 标记用于诸如<summary>,<remarks> 或 <returns> 等标记内,使您得以将结构添加到文本中。<para>content</para>content:段落文本。
<code>*提供了一种插入代码的方法。<code src="src" language="lan" encoding="c"/>src:代码文件的位置

 

  language:代码的计算机语言

  encoding:文件的编码

<img>*用以在文档中插入图片<img src="src"/>src:图片的位置,相对于注释所在的XML文件
<file>*用以在文档中插入文件,在页面中表现为下载链接<file src="src"/>src:文件的位置,相对于注释所在的XML文件
<localize>*提供一种注释本地化的方法,名称与当前线程语言不同的子节点将被忽略<localize>

 

  <zh-CHS>中文</zh-CHS>

  <en>English</en>

  ...

  </localize>

五.注释与帮助文档

  完善注释信息的最终目的就是为了生成MSDN一样的程序帮助文档,此文档将在项目整个生命周期中被各种角色使用:开发人员通过此文档维护程序, 测试人员通过此文档了解业务逻辑, 项目管理人员将此文档用作项目说明等等.

  所以要了解列表中这些不常见的注释究竟有何作用,就要和最终的帮助文档关联起来.下面通过示例讲解注释标签在帮助文件中的作用.有关如何生成帮助文件,将在本系列下一篇文章中讲解.

  先简单看一下帮助文件的样子.我们都看过MSDN帮助文档,使用注释XML文件生成的帮助文件后缀名是chm,打开后和MSDN基本一样:

使用.NET中的XML注释(一) -- XML注释标签讲解

  本示例的命名空间是XmlCommentClassDemo, 其中包含两个类:

  UserBL是包含方法的类.

  UserInfo是一个模型类.里面只有UserId和UserName两个属性.

  (1)类注释 看一下UserBL类的注释代码:

  /// <summary>
  /// 用户对象业务逻辑层.
  /// </summary>
  /// <remarks>
  /// 2009.01.01: 创建. ziqiu.zhang <br/>
  /// 2009.01.23: 增加GetUserName和GetUserId方法. ziqiu.zhang <br/>
  /// </remarks>
  public class UserBL
  {...}

  Summary标签的内容在命名空间类列表中显示,如上图.remarks标签的内容则显示在类页面中,如下图:

使用.NET中的XML注释(一) -- XML注释标签讲解

  对比以前的注释规范,下面的注释是我们规定在创建一个新的文件时需要添加到头部的注释:

/***************************************************************************************
* *
* *    File Name    : HotelCommentHeaderInfo.cs
* *    Creator      : ziqiu.zhang
* *    Create Time    : 2008-09-17
* *    Functional Description : 酒店的点评头模型。包括酒店实体对应的点评头,酒店的OutHotelInfo信息
*                  ,酒店实体的Tag信息集合。
* *    Remark   :
* *
* * Copyright (c) eLong Corporation. All rights reserved.
* ***************************************************************************************/

  添加此注释块的目的很好.但是很难推广.因为这段注释并不能被编译器识别,也无法添加到注释XML文件中用于生成帮助文件. 格式不容易记忆,想添加的时候只能从别的复制过来后修改.公司缺少完善的Code Review机制所以最后很多文件都没有此注释块.

  相比较使用.NET自己的注释语言,不仅"敏捷",而且会成为帮助文件中的描述.

  (2)方法注释

  类的注释比较简单.为了样式常用注释标签的效果, 我在方法的注释中使用了尽可能多的注释标签.代码如下:

    /// <summary>
    ///   根据用户Id得到用户名.
    ///   <para>
    ///     此处添加第二段Summary信息,在MSDN中很少使用.所以不推荐使用.
    ///   </para> 
    /// </summary>
    /// <remarks>
    ///   如果没有找到用户则返回null.<br/>
    ///   <paramref name="userId"/> 参数为正整数.<br/>
    ///   用户Id模型属性定义参见<see cref="UserInfo.UserId"/><br/>
    ///   相关方法:<seealso cref="UserBL.GetUserId"/>
    /// </remarks>
    /// <param name="userId">用户Id</param>
    /// <returns>用户真实姓名</returns>
    /// <example>
    ///   返回用户id为100的用户真实姓名:
    ///   <code>
    ///     private string userName = string.Empty;
    ///     userName = UserBL.GetUserName(100);
    ///   </code>
    ///   返回的用户名可能为null,使用时要先判断:<br/>
    ///   <c>if(userName!=null){...}</c>
    /// </example>
    /// <exception cref="System.ApplicationException">
    ///   如果用户Id小于0则抛出此异常
    /// </exception>
    public static string GetUserName(long userId)
    {
      string result = string.Empty;
      if (userId < 0)
      {
        throw new System.ApplicationException();        
      }
      else if (userId == 0)
      {
        result = null;
      }
      else
      {
        result = "Robert";
      }
      return result;
    }

  接下来通过图片进行详细讲解.首先是查看类成员时的截图:

使用.NET中的XML注释(一) -- XML注释标签讲解

  点击方法后的截图:

使用.NET中的XML注释(一) -- XML注释标签讲解

  需要注意的几点:

  1) 最开始seealso标签添加在了remarks标签中,所以在See Also区域没有添加上方法的连接. 解决方法是把seealso标签放在summary标签中.

  2) 异常类的cref属性需要设置成编译器可以识别的类, 这样才可以在帮助文档中点击.比如上面的System.ApplicationException异常点击后进入微软的在线MSDN查询.如果是自己定义的异常, 需要此异常类也在你的帮助文件中.一般提供注释XML和依赖DLL即可.

  (3) 属性的注释

  属性的注释也很简单.和类不同的地方在于属性要使用<value>标签而不是<remarks>进行描述:

    private string m_UserName = string.Empty;
    /// <summary>
    /// 用户真实姓名
    /// </summary>
    /// <value>用户真实姓名字符串.默认值为空.</value>
    public string UserName
    {
      get { return m_UserName; }
      set { m_UserName = value; }
    }

  效果如图:

使用.NET中的XML注释(一) -- XML注释标签讲解

  六.总结

  本文讲解了.NET中的XML注释标签, 以及最后在帮助文档中的作用.

  了解了标签的使用,在下篇文章中将告诉大家如何使用工具生成本文示例中的帮助文件.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql tddl_TDDL思考总结

单机数据库分布式数据库TDDL原理与最佳实践1. 数据库的结构1.1. KV存储(id是K)1.2. B树与红黑树B树的特点是叶子节点是块状&#xff0c;一个叶子里面有多个数据&#xff0c;相邻数据是存在一起的&#xff0c;123&#xff0c;456起等&#xff0c;而磁盘也是按块的&#xff0c;B树…

c# winform中窗体切换后释放及防止重复生成

问题1&#xff1a;窗体切换后如何关闭,并释放资&#xff1f;c# winform中,2个窗体,form1和form2,互相切换的时候执行this.Hide(); Form2 form2 new Form2();form2.Show();此时你会发现当Form2显现时&#xff0c;Form1隐藏了&#xff0c;但当你关闭Form2时&#xff0c;其进程并…

2018程序员必备碎片化学习工具(年度精选)

2017马上就要过去了&#xff0c;2018来了。工作、生活节奏超快的今天&#xff0c;想要不断提升自我&#xff0c;碎片化阅读学习是你最佳的选择&#xff0c;如果你有一颗学习的心&#xff0c;那这些学习型的公众号&#xff0c;绝对会让你受益匪浅。小编为你精选了技术领域几个精…

mfc 找到字符串中字符_[LeetCode] 467. 环绕字符串中唯一的子字符串

题目链接&#xff1a; https://leetcode-cn.com/problems/unique-substrings-in-wraparound-string难度&#xff1a;中等通过率&#xff1a;35.6%题目描述:把字符串 s 看作是"abcdefghijklmnopqrstuvwxyz"的无限环绕字符串&#xff0c;所以 s 看起来是这样的&#xf…

ntopng mysql_网络流量监控工具与分析Ntop和Ntopng

Ntop工具NtopNtop是一种监控网络流量工具&#xff0c;用ntop显示网络的使用情况比其他一些网络管理软件更加直观、详细。Ntop甚至可以列出每个节点计算机的网络带宽利用率。Ntop工作方式1. 命令行界面2. web界面Ntop的功能1. 可以自动从网络中获取有用的信息2. 可以将获取的数据…

一文读懂背包问题

转自&#xff1a;刘毅https://www.61mon.com/index.php/archives/188/问题展开有 N 件物品和一个容量为 V 的背包。第 i 件物品的体积是 Ci&#xff0c;其价值是 Wi。求解&#xff0c;在不超过背包容量情况下&#xff0c;将哪些物品装入背包可使价值总和最大。基本思路这是最基…

小米造车是智能手机进入红海后的突围之举

日前&#xff0c;媒体报道小米已确定造车&#xff0c;并视其为战略级决策。此前&#xff0c;雷静曾多次考虑造车&#xff0c;但未下定决心&#xff0c;而是选择了投资蔚来和小鹏&#xff0c;而且并未占多少股权&#xff0c;小米在两家公司上市时的持股份额均不到 5%&#xff0c…

群论的创立:两个少年天才的接力

我们生活的世界中&#xff0c;美丽的对称无处不在。不过喜欢认死理的数学家&#xff0c;则硬要用他们独特的语言来定义对称。在数学上&#xff0c;对称与群相关联。随着数论、代数方程和几何等研究方向的发展&#xff0c;“群论”这个无比重要的数学领域被开创建立。而这一伟大…

普通程序员转型深度学习指南

AI领域人才奇缺&#xff0c;炙手可热的AI专业应届生年薪30万起步&#xff0c;AI毕业生基本不用找工作&#xff0c;都已经被企业早早预定。AI人才究竟有多紧缺&#xff1f;据腾讯研究院《全球人工智能人才白皮书》报告数据&#xff0c;目前全球AI领域人才仅约30万&#xff0c;全…

sm缩写代表什么意思_pe、PE在电气有代表什么意思,你发现没有,电气技术很有意思...

pe、pe、pe这些是什么意思解说1&#xff0c;听小课堂电小二跟你讲PE是Protecting Earthing的缩写&#xff0c;简体中文名称称之为“保护导体”&#xff0c;也就是我们通常所说的“地线”&#xff0c;我国规定PE线为黄绿双色线 。1.PE线的应用PE线是专门用于将电气装置外露导电部…

java短信接口 调用_带你了解短信接口的调用

查看接口说明image.png注册账号注册成功的页面如下&#xff1a;image.png设置短信内容的签名比如&#xff1a;将短信签名设置为yzcimage.png查取短信接口密钥image.png设计Java程序短信发送客户端的代码如下&#xff1a;package day02;import org.apache.http.Header;import or…

抢鲜体验.NET6 Preview1,配上Docker简直停不下来!

新年复工后的第一件大事儿就是上周三重磅发布的.NET6 Preview1&#xff0c;发布了很多的新特性&#xff0c;让人欢欣鼓舞&#xff01;然而有些小伙伴儿却担心学不过来了&#xff0c;其实不用担心的&#xff0c;照常用你的.NET5&#xff0c;等11月份.NET6 LTS正式发布了&#xf…

实用金属材料手册_机械密封选用手册

《机械密封选用手册》较系统地介绍了机械密封的原理、结构、材料及辅助系统装置及安装、使用方法和故障分析等。内容以产品样本图册为主&#xff0c;并做了相应的结构说明。本书重点介绍了机械密封的选用方法&#xff0c;读者可根据介质、温度、压力、转速等工况条件选取合适的…

为什么在人工智能火爆的现在,我们还在做数据分析

这些年来&#xff0c;随着进入大数据时代&#xff0c;各行各业均有一个词频频被提到&#xff0c;那就是数据分析。那么数据分析究竟是什么呢&#xff1f;数据分析就是指用适当的统计分析方法对收集来的大量数据进行处理分析&#xff0c;提取有用信息并形成结论&#xff0c;从而…

web高德地图怎么加载离线地图_怎么验证全国离线卫星地图缓存文件的完整性

1. 概述自从我们发布了《如何离线浏览全国7137GB海量谷歌卫星离线影像》一文后&#xff0c;很多用户都在问下载海量数据的具体方法&#xff0c;为了解决大家的困惑&#xff0c;于是又分别发布了《如何一次性下载全国谷歌卫星影像地图数据的方法》和《如何一次性下载谷歌地球的全…

为什么程序员发现不了自己的BUG?

最近在朋友圈流行了这样的一个小学数学题&#xff0c;当然结果是“出乎意料”&#xff0c;看似简单的结果&#xff0c;几乎很少有人做对&#xff0c;而分析下来的原因无非是惯性思维下的粗心导致的完全错误&#xff0c;今天小编就带大家一起分析下思考过程。看图可知&#xff0…

IP代理在网络游戏中的应用

前些天同学开了打钱工作室&#xff0c;想玩外服魔兽打点游戏B赚点钱&#xff0c;可是不会上外国魔兽&#xff0c;叫我帮忙给看看怎么才能玩外服。现在我就来做个简单的教程&#xff0c;说明一下怎么玩外服吧。先说明一些现状&#xff1a;一些海外网络游戏服务器和带宽资源有限&…

【干货】人人都能看懂的LSTM

推荐阅读时间&#xff1a;8min~13min推荐理由&#xff1a;这是在看了台大李宏毅教授的深度学习视频之后的一点总结和感想。看完介绍的第一部分RNN尤其LSTM的介绍之后&#xff0c;整个人醍醐灌顶。10. 从RNN说起循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RN…

Csv数据库CsvDb

在工控领域&#xff0c;经常遇到断电关机数据库文件损坏的情况&#xff0c;SQLite如此&#xff0c;LiteDb也是这样。ZTO有数万自动化扫描设备&#xff0c;每天都有数百台设备因断电数据库损坏等原因&#xff0c;而不得不重装软件。因此&#xff0c;设计了CsvDb&#xff0c;用于…

一位像素艺术家用39张动图,将大自然的唯美尽收眼底…

Lioness 是一位像素艺术家&#xff0c;会制作 Gifs、icons、实体模型以及像素艺术教程等等。但其实&#xff0c;他的大部分精力集中在大自然灵感艺术&#xff0c;“Natural Palettes”便是其中一个项目。在这个项目里面&#xff0c;除了常见的配色图片以外&#xff0c;以 GIF 形…