使用.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文件,需要我们在项目属性中进行设置:

122608_0537_NetXML1.jpg

如上图所示,在项目的"属性页"->"生成"中, 勾选"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基本一样:

image

 

本示例的命名空间是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标签的内容则显示在类页面中,如下图:

image

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

/***************************************************************************************
 * *
 * *        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;
        }

 

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

image

点击方法后的截图:

image

需要注意的几点:

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; }
        }

效果如图:

image

六.总结

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

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

转载于:https://www.cnblogs.com/zhangziqiu/archive/2009/01/23/XmlComment.html

【YOLOv8全方位学习手册】第四章 数据增强:从扩充数据到塑造模型的认知边界 """使用 Albumentations 做自定义增强,兼容 YOLO 格式"""])# 转成 numpy# boxes 必须是 [[x_min,y_min,x_max,y_max], ...]# 在数据加载时调用你可以把集成到 PyTorch 的 Dataset 类里,或使用 Ultralytics 自带的DataLoader。 阅读详情

相关推荐

基于STM32L4XX、HAL库的RTL8201F 以太网收发器(PHY)驱动程序设计

define PHY_RESET_DELAY 1000 // PHY复位延迟(ms)#define PHY_AUTONEGO_DELAY 3000 // 自动协商延迟(ms)/* 检查PHY ID (RTL8201F的ID为0x001CC816) *//* 系统时钟配置,确保ETH有50MHz时钟 *//* 初始化CPU, AHB和APB总线时钟 */

zhusl6688的博客 749

C#中的XML文档注释-推荐的文档注释标记

文档注释是为了方便自己和他人更好地理解代码所实现的功能。下面记录了些常用的文档注释标记: <C> 用法:<c>text</c> 将说明中的文本标记为代码。例如: /// <summary> /// Validates the user. /// </summary> /// <param name="user...

weixin_30709809的博客 172

【YoloV12改进策略】基于流形约束超连接(mHC)增强YoloV12全局特征提取能力_独家复现_梁文峰署名论文

论文标题:流形约束超连接 (Manifold-Constrained Hyper-Connections, mHC)核心问题:针对超连接 (Hyper-Connections, HC) 扩展残差流宽度时破坏恒等映射、引发训练不稳定性和高内存开销的问题,提出种约束性框架。目标:恢复残差连接的稳定性与可扩展性,同时保持HC的性能增益。基准模型:基于DeepSeek-V3的MoE架构,进行了3B、9B、27B模型的实验验证。论文图示mHC 是个通用的HC扩展框架。

m0_47867638的博客 1309

xml文件单行注释、多行注释问题

xml文件单行注释、多行注释问题

Mr_zhang66的博客 2542

.Net 生成API文档

.摘要     .Net允许开发人员在源代码中插入XML注释,这在多人协作开发的时候显得特别有用。 C#解析器可以把代码文件中的这些XML标记提取出来,并作进步的处理为外部文档。 这篇文章将展示如何使用这些XML注释。 在项目开发中,很多人并不乐意写繁杂的文档。但是,开发组长希望代码注释尽可能详细;项目规划人员希望代码设计文档尽可能详尽;测试、检查人员希...

逆-血 2310

C# 自动生成代码API文档

暂时没学会正规的转载style临时记录NET中的规范标准注释() -- XML注释标签讲解 http://www.cnblogs.com/mq0036/p/3544264.html NET中的规范标准注释() -- 创建帮助文档入门篇 http://www.cnblogs.com/mq0036/p/3544268.html 简言之: 1. 设置build参数,使XML...

weixin_30301449的博客 1633

解决:xml文件单行注释、多行注释问题

【解决:xml文件中的单释、多行注释问题】 第种(单行): <!-- 注释内容 --> 第二种(多行): <!-- 注释内容(无其他注释符) ...

qq_33423991的博客 13万+

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

注释生成XML文件 常见注释标签列表 标签名称 说明 语法 参数  标记应当用于描述类型或类型成员。使用 添加针对某个类型说明的补充信息。  标记的文本是唯有关 IntelliSense 中的类型的信息源,它也显示在 对象浏览器 中。 su

feihu_guest的专栏 2265

.NET中的XML注释标签讲解

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

dengyanxi2992的博客 172

.net中的XML注释标签讲解

.摘要.Net允许开发人员在源代码中插入XML注释,这在多人协作开发的时候显得特别有用。 C#解析器可以把代码文件中的这些XML标记提取出来,并作进步的处理为外部文档。 这篇文章将展示如何使用这些XML注释。 在项目开发中,很多人并不乐意写繁杂的文档。但是,开发组长希望代码注

498

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

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

Jason 的专栏 408

simulink实现QPSK解调,基于simulink的qpsk的调制与解调,matlab

MATLAB simulink实现的QPSK解调,含完整实验报告

MIPS CPU设计(HUST).zip

全部关卡,复制txt,满分过,方便快捷

上一篇: 参数编码 完全解决方案
下一篇: 使用.NET中的XML注释(二) -- 创建帮助文档入门篇
diaoshisun9421
博客等级 码龄10年 4粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值