Рекомендуемые XML-теги для комментариев к документации по C#
В комментариях к документации по C# используются XML-элементы, что позволяет определить структуру выходной документации. Одним из последствий использования этой функции является то, что в комментарии к документации можно добавить любой допустимый XML-код. Компилятор C# копирует эти элементы в выходной XML-файл. Несмотря на то что в комментариях (включая любой допустимый HTML-элемент) можно использовать любой допустимый XML-код, документирование кода рекомендуется по многим причинам.
Далее приводится ряд рекомендаций, распространенные сценарии использования и вопросы, которые нужно иметь в виду при работе с тегами XML-документации в коде C#. Несмотря на то что теги можно поместить в комментарии к документации, в этой статье описываются рекомендуемые теги для наиболее распространенных конструкций языка. Во всех случаях следует соблюдать следующие рекомендации:
- Для обеспечения согласованности все открытые типы и их члены должны быть задокументированы.
- Закрытые члены можно также задокументировать с помощью XML-комментариев. Однако это приводит к раскрытию внутренних (возможно, конфиденциальных) процессов библиотеки.
- Как минимум, типы и их члены должны иметь
<summary>
тег. - Текст документации должны быть написан с использованием законченных предложений, в конце которых ставится точка.
- Частичные классы полностью поддерживаются, а сведения о документации объединяются в одну запись для каждого типа. Если оба объявления частичного члена имеют комментарии к документации, комментарии о реализации объявления записываются в выходной XML.
Документация XML начинается с ///
. При создании проекта шаблоны добавляют несколько строк ///
. Обработка этих комментариев имеет некоторые ограничения.
- Документация должна представлять собой XML с правильным форматом. Если XML сформирован неправильно, компилятор выдает предупреждение. Файл документации содержит комментарий, который говорит, что возникла ошибка.
- Некоторые из рекомендуемых тегов имеют особые значения:
- Тег
<param>
используется для описания параметров. При использовании этого тега компилятор проверяет, что параметр существует и все параметры описаны в документации. При сбое проверки компилятор выдает предупреждение. - Атрибут
cref
может быть присоединен к любому тегу для ссылки на элемент кода. Компилятор проверяет наличие этого элемента кода. При сбое проверки компилятор выдает предупреждение. Компилятор учитывает всеusing
директивы при поиске типа, описанного в атрибутеcref
. - Тег
<summary>
используется технологией IntelliSense в Visual Studio для отображения дополнительных сведений о типе или элементе.Примечание.
XML-файл не предоставляет полную информацию о типе и членах (например, он не содержит никаких сведений о типе). Чтобы получить полную информацию о типе или элементе, используйте файл документации вместе с отражением для текущего типа или элемента.
- Тег
- Разработчики могут создавать собственные наборы тегов. Компилятор копирует эти теги в выходной файл.
Некоторые из рекомендуемых тегов можно использовать для любого элемента языка. Другие имеют более специализированное использование. Наконец, некоторые теги используются для форматирования текста в документации. В этой статье описываются рекомендуемые теги, упорядоченные по их использованию.
Компилятор проверяет синтаксис элементов, за которым следует один * в следующем списке. Visual Studio предоставляет IntelliSense для тегов, проверенных компилятором и всеми тегами, за которыми следует ** в следующем списке. Помимо указанных здесь тегов, компилятор и Visual Studio проверяют теги <b>
, <i>
, <u>
, <br/>
и <a>
. Компилятор также проверяет <tt>
, который является устаревшим тегом HTML.
- Общие теги, используемые для нескольких элементов. Эти теги являются минимальным набором для любого API.
- Теги, используемые для членов. Эти теги используются при документировании методов и свойств.
<returns>
: значение этого элемента отображается в IntelliSense в Visual Studio.<param>
*: значение этого элемента отображается в IntelliSense в Visual Studio.<paramref>
<exception>
*<value>
: значение этого элемента отображается в IntelliSense в Visual Studio.
- Формат вывода документации. Эти теги предоставляют направления форматирования для средств, создающих документацию.
- Повторное использование текста документации. Эти теги предоставляют средства, упрощающие использование комментариев XML.
<inheritdoc>
**<include>
*
- Создание ссылок и гиперссылок. Эти теги создают ссылки на другую документацию.
- Теги для универсальных типов и методов . Эти теги используются только для универсальных типов и методов.
<typeparam>
*: значение этого элемента отображается в IntelliSense в Visual Studio.<typeparamref>
Примечание.
Комментарии документации не применяются к пространству имен.
Чтобы ввести в текст комментария документации угловые скобки, используйте для символов <
и >
коды HTML <
и >
соответственно. Это показано в следующем примере.
/// <summary>
/// This property always returns a value < 1.
/// </summary>
Общие теги
<summary>
<summary>description</summary>
Тег <summary>
следует использовать для описания типа или элемента типа. Используйте <примечания для добавления дополнительных> сведений в описание типа. Чтобы включить средства документации, такие как DocFX и Sandcastle, для создания внутренних гиперссылок на страницы документации для элементов кода, используйте атрибут cref. Текст тега <summary>
отображается в IntelliSense и в окне браузера объектов.
<remarks>
<remarks>
description
</remarks>
Тег <remarks>
используется для добавления сведений о типе или члене типа, дополняя сведения, указанные с <сводкой>. Эти сведения отображаются в окне "Обозреватель объектов". Этот тег может включать более длинные объяснения. Вы можете найти, что использование CDATA
разделов для markdown делает его более удобным. Такие средства, как docfx, обрабатывают текст разметки в разделах CDATA
.
Члены документа
<возвращает>
<returns>description</returns>
Тег <returns>
следует использовать в комментариях к объявлению метода для описания возвращаемого значения.
<param>
<param name="name">description</param>
name
: имя параметра метода. Заключите имя в кавычки ("). Имена параметров должны соответствовать сигнатуре API. Если один или несколько параметров не рассматриваются, компилятор выдает предупреждение. Компилятор также выдает предупреждение, если значениеname
не соответствует формальному параметру в объявлении метода.
Тег <param>
следует использовать в комментариях к объявлению метода для описания одного из параметров такого метода. Чтобы задокументировать несколько параметров, используйте несколько тегов <param>
. Текст тега <param>
отображается в IntelliSense, обозревателе объектов и веб-отчете по комментариям к коду.
<paramref>
<paramref name="name"/>
name
: имя параметра, на который указывается ссылка. Заключите имя в кавычки (").
Тег <paramref>
позволяет указать, что слово в комментариях к коду, например в блоке <summary>
или <remarks>
, ссылается на параметр. В XML-файл такое слово может выделяться особым образом, например курсивом или полужирным шрифтом.
<exception>
<exception cref="member">description</exception>
- cref = "
member
": ссылка на исключение, которое доступно из текущей среды компиляции. Компилятор проверяет, существует ли исключение, и приводитmember
к каноническому имени элемента в выходных XML-данных.member
должен отображаться в кавычках (").
Тег <exception>
служит для указания возможных исключений. Этот тег может применяться к определениям методов, свойств, событий и индексаторов.
<значение>
<value>property-description</value>
Тег <value>
позволяет описывать значение, которое представляется свойством. При добавлении свойства с помощью мастера кода в среде разработки Visual Studio .NET он добавляет <сводный> тег для нового свойства. Следует вручную добавить тег <value>
для описания значения, которое представляется свойством.
Форматирование выходных данных документации
<p>ara
<remarks>
<para>
This is an introductory paragraph.
</para>
<para>
This paragraph contains more details.
</para>
</remarks>
Тег <para>
предназначен для использования внутри тега, например <сводки>, <примечания> или< возврата>, а также позволяет добавлять структуру в текст. Тег <para>
создает абзац с двойным отступом. Используйте тег <br/>
, если хотите добавить в него один абзац.
<список>
<list type="bullet|number|table">
<listheader>
<term>term</term>
<description>description</description>
</listheader>
<item>
<term>Assembly</term>
<description>The library or executable built from a compilation.</description>
</item>
</list>
Блок <listheader>
используется для определения строки заголовка в таблице или списке определений.
При определении таблицы:
- Необходимо указать только запись
term
в заголовке. - Каждый элемент в списке указывается в блоке
<item>
. Для каждой из нихitem
необходимо указать только записьdescription
.
При создании списка определений:
- Необходимо указать запись
term
в заголовке. - Каждый элемент в списке указывается в блоке
<item>
. Каждыйitem
должен содержать как a,term
так иdescription
.
Число блоков <item>
в списке или таблице не ограничено.
<c>
<c>text</c>
С помощью тега <c>
можно указать, что текст в описании необходимо пометить как код. Используйте <код> для указания нескольких строк в виде кода.
<code>
<code>
var index = 5;
index++;
</code>
Тег <code>
используется для указания нескольких строк кода. Используйте <c> , чтобы указать, что однострочный текст в описании должен быть помечен как код.
<Пример>
<example>
This shows how to increment an integer.
<code>
var index = 5;
index++;
</code>
</example>
Тег <example>
позволяет указать пример использования метода или другого элемента библиотеки. Пример обычно включает использование тега <кода> .
Повторное использование текста документации
<наследуемая>
<inheritdoc [cref=""] [path=""]/>
Наследование XML-комментариев от базовых классов, интерфейсов и аналогичных методов. Использование inheritdoc
позволяет обойтись без копирования и вставки одинаковых XML-комментариев и автоматически поддерживать их синхронизацию. При добавлении тега в <inheritdoc>
тип все члены также наследуют комментарии.
cref
: указывает элемент, из которого следует наследовать документацию. Уже определенные теги текущего члена не переопределяются унаследованными.path
: запрос выражения XPath, который приводит к показанию набора узлов. С помощью этого атрибута можно отфильтровать теги, которые следует включить в наследуемую документацию или исключить из нее.
Добавьте XML-комментарии в базовые классы или интерфейсы, и InheritDoc скопирует их во все реализации классов. Добавьте XML-комментарии в синхронные методы, и InheritDoc скопирует их в асинхронные версии аналогичных методов. Если нужно скопировать комментарии из определенного элемента, укажите нужный элемент в атрибуте cref
.
<include>
<include file='filename' path='tagpath[@name="id"]' />
filename
: имя XML-файла, содержащего документацию. Имя файла может быть квалифицировано с помощью относительного пути к файлу исходного кода.filename
необходимо заключать в одинарные кавычки (' ').tagpath
: путь тегов вfilename
, который ведет к тегуname
. Путь необходимо заключать в одинарные кавычки (' ').name
: описатель имени в теге, который предшествует комментариям;name
имеет .id
id
: идентификатор тега, который предшествует комментариям. Заключите идентификатор в кавычки (").
Тег <include>
позволяет задать ссылку на комментарии в другом файле, которые описывают типы и элементы вашего исходного кода. Включение внешнего файла является альтернативой размещению комментариев документации непосредственно в файле исходного кода. Помещая комментарии документации в отдельный файл, вы можете реализовать управление их версиями отдельно от версий исходного кода. В этом случае файл исходного кода может быть извлечен для изменения одним пользователем, а файл документации — другим. Тег <include>
использует XML-синтаксис XPath. Сведения об использовании тега <include>
см. в документации по XPath.
Например, следующий исходный <include>
код использует тег для включения примечаний. Путь к файлу относительно источника.
namespace MyNamespace;
public class MyType
{
/// <returns>This is the returns text of MyMethod. It comes from triple slash comments.</returns>
/// <remarks>This is the remarks text of MyMethod. It comes from triple slash comments.</remarks>
/// <include file="MyAssembly.xml" path="doc/members/member[@name='M:MyNamespace.MyType.MyMethod']/*" />
public int MyMethod(int p) => p;
}
Xml-источник для файла включения показан в следующем примере. Он структурирован так же, как XML-файл, созданный компилятором C#. XML-файл может содержать текст для нескольких методов или типов, если выражение XPath может их идентифицировать.
<?xml version="1.0"?>
<doc>
<members>
<member name="M:MyNamespace.MyType.MyMethod">
<param name="p">This is the description of the parameter p of MyMethod. It comes from the included file.</param>
<summary>This is the summary of MyMethod. It comes from the included file.</summary>
</member>
</members>
</doc>
Выходные данные XML для этого метода показаны в следующем примере:
<member name="M:MyNamespace.MyType.MyMethod(System.Int32)">
<summary>This is the summary of MyMethod. It comes from the included file.</summary>
<returns>This is the returns text of MyMethod. It comes from triple slash comments.</returns>
<remarks>This is the remarks text of MyMethod. It comes from triple slash comments.</remarks>
<param name="p">This is the description of the parameter p of MyMethod. It comes from the included file.</param>
</member>
Совет
Команда среды выполнения .NET широко использует <include>
тег в своей документации. Вы можете просмотреть множество примеров, выполнив поиск в репозиторииdotnet/runtime
.
Создание ссылок и гиперссылок
<see>
<see cref="member"/>
<!-- or -->
<see cref="member">Link text</see>
<!-- or -->
<see href="link">Link Text</see>
<!-- or -->
<see langword="keyword"/>
cref="member"
: ссылка на член или поле, которые доступны для вызова из текущей среды компиляции. Компилятор проверяет, существует ли элемент кода, и передаетmember
в имя элемента в выходных XML-данных. Поместите член в кавычки ("). Можно указать другой текст ссылки для "cref", используя отдельный закрывающий тег.href="link"
: гиперссылка на заданный URL-адрес. Например,<see href="https://github.com">GitHub</see>
формирует гиперссылку с текстом GitHub, которая ведет на сайтhttps://github.com
.langword="keyword"
: ключевое слово языка, напримерtrue
одно из других допустимых ключевых слов.
Тег <see>
позволяет задать ссылку из текста. Используйте <seealso> , чтобы указать, что текст должен быть помещен в раздел "См. также". Используйте атрибут cref для создания внутренних гиперссылок на страницы документации для элементов кода. Вы включаете параметры типа, чтобы указать ссылку на универсальный тип или метод, например cref="IDictionary{T, U}"
. Кроме того, является допустимым атрибутом, href
который функционирует как гиперссылка.
<seealso>
<seealso cref="member"/>
<!-- or -->
<seealso href="link">Link Text</seealso>
cref="member"
: ссылка на член или поле, которые доступны для вызова из текущей среды компиляции. Компилятор проверяет, существует ли элемент кода, и передаетmember
в имя элемента в выходных XML-данных.member
должен отображаться в кавычках (").href="link"
: гиперссылка на заданный URL-адрес. Например,<seealso href="https://github.com">GitHub</seealso>
формирует гиперссылку с текстом GitHub, которая ведет на сайтhttps://github.com
.
С помощью тега <seealso>
можно указать текст, который должен отображаться в разделе См. также. Используйте <для> указания ссылки из текста. Нельзя вложить seealso
тег внутри тега summary
.
Атрибут cref
Атрибут cref
в теге XML-документации означает "справочник по коду". Он указывает, что внутренний текст тега является элементом кода, например типом, методом или свойством. Средства создания документации, такие как DocFX и Sandcastle, используют атрибуты cref
для автоматического создания гиперссылок на страницу, где документирован тип или член.
Атрибут href
Атрибут href
означает ссылку на веб-страницу. Его можно использовать для прямой ссылки на интерактивную документацию по API или библиотеке.
Универсальные типы и методы
<typeparam>
<typeparam name="TResult">The type returned from this method</typeparam>
TResult
: имя параметра типа. Заключите имя в кавычки (").
Тег <typeparam>
следует использовать в комментариях к объявлению универсального типа или метода для описания параметра типа. Добавьте такой тег для каждого параметра типа универсального типа или метода. Текст тега <typeparam>
отображается в IntelliSense.
<typeparamref>
<typeparamref name="TKey"/>
TKey
: имя параметра типа. Заключите имя в кавычки (").
Используйте этот тег, чтобы разрешить получателям файла документации форматировать слово определенным образом, например курсивным шрифтом.
Пользовательские теги
Все теги, описанные в этой статье, представляют эти теги, распознанные компилятором C#. Тем не менее пользователь может определять собственные теги. Такие инструменты, как Sandcastle, поддерживают дополнительные теги, такие как <события> и <заметки>, и даже поддерживают документирование пространств имен. Средства создания пользовательской или внутренней документации также можно использовать со стандартными тегами. Кроме того, поддерживается несколько выходных форматов — от HTML до PDF.