亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C# XML 文檔注釋文件格式

2019-11-17 02:31:48
字體:
來源:轉載
供稿:網友

C# xml 文檔注釋文件格式

在編寫 C# 代碼時,只要在注釋按照格式加入 XML 文檔注釋,例如:

/// <summary>/// 這里是類的注釋。/// </summary>public class MyClass { }

就可以通過設置項目的"屬性->生成->輸出->XML 文檔文件",來為當前項目生成包含所有文檔注釋的 XML 文件。一般可用于 Visual Studio 的智能提示,或者利用Sandcastle等工具生成文檔。

下面,我會介紹生成的 XML 文件的格式和相關規則,都以 C# 編譯器生成的結果為基準。

一、XML 文檔注釋文件格式

XML 文檔注釋的文件格式非常簡單,就是一個包含了所有注釋的列表,一個簡單的例子如下所示:

XML 文件的根節點是doc,下面包含兩個子節點assemblymembers。其中assembly是 XML 文件對應的程序集名稱,members則包含了多個member節點,列出了所有的注釋(不區分是公共、受保護的還是私有成員)。member節點的name元素是一個唯一的標識符,與程序集中定義的類、方法、屬性、字段等成員一一對應。在編寫文檔注釋時指定的cref屬性,也會全部轉換為標識符,而不是原先指定的成員名稱。

<?xml version="1.0"?><doc>    <assembly>        <name>Cyjb</name>    </assembly>    <members>        <member name="T:Cyjb.ArrayExt">            <summary>            提供數組的擴展方法。            </summary>        </member>        <member name="M:Cyjb.ArrayExt.Left``1(``0[],System.Int32)">            <summary>            從當前數組的左端截取一部分。            </summary>            <typeparam name="T">數組中元素的類型。</typeparam>            <param name="array">從該數組返回其最左端截取的部分。</param>            <param name="length">要截取的元素個數。            如果為 <c>0</c>,則返回空數組。如果大于或等于 <paramref name="array"/> 的長度,            則返回整個數組的一個淺拷貝。</param>            <returns>從指定數組的左端截取的部分。</returns>            <exception cref="T:System.ArgumentNullException"><paramref name="array"/> 為 <c>null</c>。</exception>            <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="length"/> 小于 <c>0</c>。</exception>        </member>        ...    </members></doc>

二、唯一標識符規則

唯一標識符總是Type:FullName的格式,其中Type表示對應成員的類型,FullName是對應成員的完全限定名,中間是用:分隔。

成員類型Type的可能值有:

  • N- 命名空間。
  • T- 類型,包括類、接口、結構體、枚舉和委托。
  • F- 字段。
  • P- 屬性。
  • M- 方法,包括普通方法、構造函數和運算符重載。
  • E- 事件。
  • !- 錯誤成員,一般是由于編譯器無法識別指定的成員類型,例如<see cref="MemberNotExists"/>,就會被編譯器轉換為<see cref="!:MemberNotExists"/>。

完全限定名FullName則與成員本身的完全限定名類似,都是從命名空間的根開始,使用點分隔。不同的是:

  1. 成員名稱中的點會被替換為#,例如構造函數的名稱.ctor會替換為#ctor
  2. 由關鍵字指定的類型,會被替換為相應類型的完全限定名,例如object會替換為System.Object,void會替換為System.Void
  3. 指針類型會表示為*,引用類型會表示為@
  4. 多維數組會表示為[lowerbound:size,lowerbound:size],其中lowerbound是數組的指定維的下限,size是相應的大小,未指定的話就直接省略。例如int[,]會替換為System.Int32[0:,0:]
  5. 泛型類型會省略掉泛型參數,并在類名后添加`num,其中num是泛型參數的個數。例如SampleType<T, T2>會替換為SampleType`2
  6. 如果成員中出現了對類型的泛型參數的引用,會使用`idx代替,其中idx是相應泛型參數在類型定義中的索引。例如上面的SampleType<T, T2>,對T的引用會替換為`0,對T2的引用會替換為`1
  7. 泛型方法同樣會省略掉泛型參數,并在類名后添加``num,其中num是泛型參數的個數。例如SampleType<T, T2>.SampleMethod<T3>會替換為SampleType`2.SampleMethod``1。
  8. 如果成員中出現了對方法的泛型參數的引用,會使用``idx代替,其中idx是相應泛型參數在方法定義中的索引。例如上面的SampleType<T, T2>.SampleMethod<T3>,對T3的引用會替換為``0。
  9. 泛型類型中的<>會被替換成{},例如IList<int>會替換為System.Collections.Generic.IList{System.Int32}。
  10. 對于隱式和顯式類型轉換方法(op_Implicitop_Explicit),由于往往單憑參數類型不足以唯一區分方法,因此會在方法后額外添加~returnType,其中returnType是方法的返回值。例如Operator SampleType(int x)會替換為SampleType.op_Explicit(System.Int32)~SampleType。

一個完整的實例如下所示,其中列出了每個成員對應的唯一標識符:

using System.Collections.Generic;// Identifier is N:Cyjbnamespace Cyjb{    /// <summary>    /// Identifier is T:Cyjb.SampleType    /// </summary>    public unsafe class SampleType    {        /// <summary>        /// Identifier is F:Cyjb.SampleType.SampleValue        /// </summary>        public const int SampleValue = 0;        /// <summary>        /// Identifier is F:Cyjb.SampleType.SampleValue2        /// </summary>        public int SampleValue2 = 0;        /// <summary>        /// Identifier is M:Cyjb.SampleType.#ctor        /// </summary>        public SampleType() { }        /// <summary>        /// Identifier is M:Cyjb.SampleType.#ctor(System.Int32)        /// </summary>        public SampleType(int value) { }        /// <summary>        /// Identifier is M:Cyjb.SampleType.SampleMethod        /// </summary>        public void SampleMethod() { }        /// <summary>        /// Identifier is M:Cyjb.SampleType.SampleMethod(System.Int32,System.Int32@,System.Int32*)        /// </summary>        public void SampleMethod(int a, ref int b, int* c) { }        /// <summary>        /// Identifier is M:Cyjb.SampleType.SampleMethod(System.Int32[],System.Int32[0:,0:],System.Int32[][])        /// </summary>        public void SampleMethod(int[] a, int[,] b, int[][] c) { }        /// <summary>        /// Identifier is M:Cyjb.SampleType.SampleMethod``1(``0,``0[],System.Collections.Generic.IList{``0},System.Collections.Generic.IList{System.Collections.Generic.IList{``0[]}})        /// </summary>        public void SampleMethod<T>(T a, T[] b, IList<T> c, IList<IList<T[]>> d) { }        /// <summary>        /// Identifier is M:Cyjb.SampleType.op_Addition(Cyjb.SampleType,Cyjb.SampleType)        /// </summary>        public static SampleType operator +(SampleType x, SampleType y) { return null; }        /// <summary>        /// Identifier is M:Cyjb.SampleType.op_Explicit(System.Int32)~Cyjb.SampleType        /// </summary>        public static explicit operator SampleType(int x) { return null; }        /// <summary>        /// Identifier is M:Cyjb.SampleType.op_Implicit(Cyjb.SampleType)~System.Int32        /// </summary>        public static implicit operator int(SampleType x) { return 0; }        /// <summary>        /// Identifier is P:Cyjb.SampleType.SamplePRoperty        /// </summary>        public int SampleProperty { get; set; }        /// <summary>        /// Identifier is P:Cyjb.SampleType.Item(System.Int32)        /// </summary>        public int this[int index] { get { return 0; } }        /// <summary>        /// Identifier is T:Cyjb.SampleType.SampleDelegate        /// </summary>        public delegate void SampleDelegate(int a);        /// <summary>        /// Identifier is E:Cyjb.SampleType.SampleEvent        /// </summary>        public event SampleDelegate SampleEvent;        /// <summary>        /// Identifier is T:Cyjb.SampleType.NestedType        /// </summary>        public class NestedType { }        /// <summary>        /// Identifier is T:Cyjb.SampleType.NestedType2`1        /// </summary>        public class NestedType2<T>        {            /// <summary>            /// Identifier is M:Cyjb.SampleType.NestedType2`1.TestMethod``1(`0,``0,System.Collections.Generic.IDictionary{`0,``0})            /// </summary>            public void TestMethod<T2>(T a, T2 b, IDictionary<T, T2> c) { }        }    }}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色老头一区二区三区在线观看| 欧美在线激情网| 亚洲视频电影图片偷拍一区| 中日韩午夜理伦电影免费| 麻豆国产精品va在线观看不卡| www.国产精品一二区| 亚洲综合在线中文字幕| 成人在线免费观看视视频| 欧美中文在线观看| 亚洲香蕉成人av网站在线观看| 日韩av高清不卡| 九九热最新视频//这里只有精品| 高清欧美电影在线| 欧美人交a欧美精品| 一区二区三区视频免费| 国产日韩综合一区二区性色av| 日本aⅴ大伊香蕉精品视频| 色偷偷91综合久久噜噜| 国产精品第七影院| 国产精品久久久久久久久久免费| 亚洲欧美另类中文字幕| 亚洲激情第一页| 欧美日韩精品国产| 亚洲精品美女免费| 亚洲国产精品人人爽夜夜爽| 欧美午夜女人视频在线| 日韩精品在线免费| 日韩电影在线观看永久视频免费网站| 欧洲成人免费aa| 欧美精品电影免费在线观看| 国产精品福利网站| 欧美激情亚洲另类| 精品国偷自产在线视频| 国产亚洲精品激情久久| 7m精品福利视频导航| 欧美—级高清免费播放| 欧美资源在线观看| 777精品视频| 日韩中文在线中文网在线观看| 国产亚洲精品久久久久久牛牛| 国产午夜精品美女视频明星a级| 国产精品美乳在线观看| 欧美xxxx做受欧美.88| 久久精品中文字幕电影| 日韩欧美精品中文字幕| 欧美激情视频免费观看| 最近日韩中文字幕中文| 成人免费看片视频| 2025国产精品视频| 中文字幕精品影院| 亚洲免费一在线| 三级精品视频久久久久| 欧美高清性猛交| 国产精品ⅴa在线观看h| 国产精品jizz在线观看麻豆| 国产日韩欧美夫妻视频在线观看| 日韩天堂在线视频| 国产精品成人国产乱一区| xvideos亚洲人网站| 欧美午夜久久久| 欧美激情精品久久久| 一区二区三欧美| 亚洲欧美日韩中文在线制服| 国产精品成人品| 国产亚洲精品久久久久久牛牛| 国产精品一区久久| 精品国产91久久久久久老师| 成人福利网站在线观看11| 国产精品扒开腿爽爽爽视频| 日韩电影在线观看免费| 国产亚洲精品成人av久久ww| 国产精品高潮呻吟久久av野狼| 97精品国产91久久久久久| 久久久人成影片一区二区三区| 91系列在线播放| 欧洲成人在线观看| 成人美女免费网站视频| 国产精品久久精品| 国产一区深夜福利| 欧美精品在线免费播放| 在线电影av不卡网址| 亚洲国产精品99| 国内精品在线一区| 日本高清+成人网在线观看| 日韩欧美在线免费观看| 日本免费一区二区三区视频观看| 久久伊人精品天天| 伊人精品在线观看| 久久中国妇女中文字幕| 国产精品自拍偷拍| 国产一区二区三区直播精品电影| 成人免费观看网址| 国产91热爆ts人妖在线| 日韩一中文字幕| 亚洲男人天天操| 国产亚洲精品激情久久| 91精品国产91久久久久久久久| 国产日韩欧美成人| 中文字幕亚洲欧美日韩2019| 91精品国产成人| 国产精品久久在线观看| 欧美精品免费看| 精品福利在线视频| 久久国产精品久久精品| 亚洲丝袜av一区| 亚洲a中文字幕| 欧美成人黑人xx视频免费观看| 亚洲综合成人婷婷小说| 国产精品三级网站| 欧美一级黑人aaaaaaa做受| 国产色综合天天综合网| 久久久久久久网站| 日韩欧美国产黄色| 91色在线视频| 欧美又大又硬又粗bbbbb| 国产欧美日韩视频| 5252色成人免费视频| 欧美日韩国产一区二区| 欧美在线性视频| 亚洲精品中文字| 久久在精品线影院精品国产| 亚洲国产小视频| 国产精品高潮呻吟久久av黑人| 亚洲国产精品小视频| 日本一区二三区好的精华液| 精品视频中文字幕| 92裸体在线视频网站| 日韩精品亚洲元码| 91亚洲精品久久久| 在线看日韩av| 亚洲黄页视频免费观看| 日韩亚洲欧美中文在线| 91精品国产色综合久久不卡98| 亚洲风情亚aⅴ在线发布| 国产精品自产拍在线观看| 久久精品成人欧美大片古装| 欧美性感美女h网站在线观看免费| 亚洲日本成人网| 日韩成人在线视频| 国产午夜精品免费一区二区三区| 国产日本欧美一区二区三区在线| 亚洲aaaaaa| 美女视频黄免费的亚洲男人天堂| 伊人一区二区三区久久精品| 成人午夜黄色影院| 一区二区三区精品99久久| 日本久久中文字幕| 2019中文字幕在线免费观看| 欧美日韩福利在线观看| 亚洲毛茸茸少妇高潮呻吟| 亚洲精品电影久久久| 夜夜嗨av色一区二区不卡| 免费91在线视频| 欧美电影电视剧在线观看| 日韩av最新在线观看| 亚洲成人在线视频播放| 久久久久久久国产精品视频| 亚洲天堂av在线免费观看| 国产午夜精品全部视频在线播放| 两个人的视频www国产精品| 欧美在线中文字幕| 亚洲第一网站男人都懂| 国产成人福利夜色影视| 欧美精品久久久久久久久久|