1---2name: csharp-docs3description: Ensure that C# types are documented with XML comments and follow best practices for documentation.4---56# C# Documentation Best Practices78- Public members should be documented with XML comments.9- It is encouraged to document internal members as well, especially if they are complex or not self-explanatory.10- Private methods that contain non-obvious or complex logic (e.g. pagination, parsing, filtering, error handling) **must** have an XML `<summary>` comment.11- Private DTO and mapping records (used for serialisation or API response mapping) should have a one-line `<summary>` describing their role — for example, which API endpoint they represent or what they serialise.12- Use inline `//` comments within method bodies for non-obvious logic: parsing decisions, API quirks, filtering rationale, or any code where the intent is not immediately clear from the identifier names alone.1314## Guidance for all APIs1516- Use `<summary>` to provide a brief, one sentence, description of what the type or member does. Start the summary with a present-tense, third-person verb.17- Use `<remarks>` for additional information, which can include implementation details, usage notes, or any other relevant context.18- Use `<see langword>` for language-specific keywords like `null`, `true`, `false`, `int`, `bool`, etc.19- Use `<c>` for inline code snippets.20- Use `<example>` for usage examples on how to use the member.21 - Use `<code>` for code blocks. `<code>` tags should be placed within an `<example>` tag. Add the language of the code example using the `language` attribute, for example, `<code language="csharp">`.22- Use `<see cref>` to reference other types or members inline (in a sentence).23- Use `<seealso>` for standalone (not in a sentence) references to other types or members in the "See also" section of the online docs.24- Use `<inheritdoc/>` to inherit documentation from base classes or interfaces.25 - Unless there is major behaviour change, in which case you should document the differences.26 - If an implementation applies filtering, pagination, mapping transformations, or any logic not implied by the interface contract, add a `<remarks>` block alongside `<inheritdoc/>` to describe it. Do not rely on `<inheritdoc/>` alone when the implementation diverges from a literal reading of the interface.2728## Methods2930- Use `<param>` to describe method parameters.31 - The description should be a noun phrase that doesn't specify the data type.32 - Begin with an introductory article.33 - If the parameter is a flag enum, start the description with "A bitwise combination of the enumeration values that specifies...".34 - If the parameter is a non-flag enum, start the description with "One of the enumeration values that specifies...".35 - If the parameter is a Boolean, the wording should be of the form "`<see langword="true" />` to ...; otherwise, `<see langword="false" />`.".36 - If the parameter is an "out" parameter, the wording should be of the form "When this method returns, contains .... This parameter is treated as uninitialized.".37- Use `<paramref>` to reference parameter names in documentation.38- Use `<typeparam>` to describe type parameters in generic types or methods.39- Use `<typeparamref>` to reference type parameters in documentation.40- Use `<returns>` to describe what the method returns.41 - The description should be a noun phrase that doesn't specify the data type.42 - Begin with an introductory article.43 - If the return type is Boolean, the wording should be of the form "`<see langword="true" />` if ...; otherwise, `<see langword="false" />`.".4445## Constructors4647- The summary wording should be "Initializes a new instance of the <Class> class [or struct].".4849## Properties5051- The `<summary>` should start with:52 - "Gets or sets..." for a read-write property.53 - "Gets..." for a read-only property.54 - "Gets [or sets] a value that indicates whether..." for properties that return a Boolean value.55- Use `<value>` to describe the value of the property.56 - The description should be a noun phrase that doesn't specify the data type.57 - If the property has a default value, add it in a separate sentence, for example, "The default is `<see langword="false" />`".58 - If the value type is Boolean, the wording should be of the form "`<see langword="true" />` if ...; otherwise, `<see langword="false" />`. The default is ...".5960## Exceptions6162- Use `<exception cref>` to document exceptions thrown by constructors, properties, indexers, methods, operators, and events.63- Document all exceptions thrown directly by the member.64- For exceptions thrown by nested members, document only the exceptions users are most likely to encounter.65- The description of the exception describes the condition under which it's thrown.66 - Omit "Thrown if ..." or "If ..." at the beginning of the sentence. Just state the condition directly, for example "An error occurred when accessing a Message Queuing API."