/// <summary>A documented class.</summary>public class MyClass{ /// <summary>Adds two numbers.</summary> public int Add(int a, int b) // CSENSE002 on both 'a' and 'b' { return a + b; } /// <summary>Processes data.</summary> /// <param name="value">The first value.</param> public void Process(int value, string name) // CSENSE002 on 'name' { }}
Correct examples
/// <summary>A documented class.</summary>public class MyClass{ /// <summary>Adds two numbers.</summary> /// <param name="a">The first number.</param> /// <param name="b">The second number.</param> public int Add(int a, int b) { return a + b; } /// <summary>Processes data.</summary> /// <param name="value">The first value.</param> /// <param name="name">The name to process.</param> public void Process(int value, string name) { }}
/// <summary>A documented class.</summary>public class MyClass{ /// <summary>Adds two numbers.</summary> /// <param name="a">The first number.</param> /// <param name="b">The second number.</param> /// <param name="c">The third number.</param> // CSENSE003 - parameter doesn't exist public int Add(int a, int b) { return a + b; } /// <summary> /// <param name="x">Nested param.</param> // CSENSE003 - nested within <summary> /// </summary> /// <param name="x">Valid param.</param> public void Method(int x) { }}
Correct example
/// <summary>A documented class.</summary>public class MyClass{ /// <summary>Adds two numbers.</summary> /// <param name="a">The first number.</param> /// <param name="b">The second number.</param> public int Add(int a, int b) { return a + b; }}
/// <summary>A generic class.</summary>public class MyClass<T> // CSENSE004 on 'T'{}/// <summary>A generic class with multiple type parameters.</summary>/// <typeparam name="T">The first type parameter.</typeparam>public class MyClass<T, U> // CSENSE004 on 'U'{}
Correct examples
/// <summary>A generic class.</summary>/// <typeparam name="T">The type of elements.</typeparam>public class MyClass<T>{}/// <summary>A generic class with multiple type parameters.</summary>/// <typeparam name="T">The first type parameter.</typeparam>/// <typeparam name="U">The second type parameter.</typeparam>public class MyClass<T, U>{}
/// <summary>A generic class.</summary>/// <typeparam name="T">The type of elements.</typeparam>/// <typeparam name="U">Another type parameter.</typeparam> // CSENSE005 - doesn't existpublic class MyClass<T>{}
Correct example
/// <summary>A generic class.</summary>/// <typeparam name="T">The type of elements.</typeparam>public class MyClass<T>{}
/// <summary>A documented class.</summary>public class MyClass{ /// <summary>Processes values.</summary> /// <param name="b">The second value.</param> /// <param name="a">The first value.</param> // CSENSE008 - wrong order public void Process(int a, int b) { }}
Correct example
/// <summary>A documented class.</summary>public class MyClass{ /// <summary>Processes values.</summary> /// <param name="a">The first value.</param> /// <param name="b">The second value.</param> public void Process(int a, int b) { }}
/// <summary>A documented class.</summary>public class MyClass{ /// <summary>Processes a value.</summary> /// <param name="value">The first description.</param> /// <param name="value">The second description.</param> // CSENSE009 public void Process(int value) { }}
Correct example
/// <summary>A documented class.</summary>public class MyClass{ /// <summary>Processes a value.</summary> /// <param name="value">The value to process.</param> public void Process(int value) { }}
/// <summary>A generic class.</summary>/// <typeparam name="U">The second type parameter.</typeparam>/// <typeparam name="T">The first type parameter.</typeparam> // CSENSE010public class MyClass<T, U>{}
Correct example
/// <summary>A generic class.</summary>/// <typeparam name="T">The first type parameter.</typeparam>/// <typeparam name="U">The second type parameter.</typeparam>public class MyClass<T, U>{}
/// <summary>A documented class.</summary>public class MyClass{ /// <summary>If userName is null, throws an exception.</summary> // CSENSE020 on 'userName' /// <param name="userName">The user's name.</param> public void Process(string userName) { } /// <summary>Compares firstValue with secondValue.</summary> // CSENSE020 on both /// <param name="firstValue">The first value.</param> /// <param name="secondValue">The second value.</param> public bool Compare(int firstValue, int secondValue) { return firstValue == secondValue; }}
Correct examples
/// <summary>A documented class.</summary>public class MyClass{ /// <summary>If <paramref name="userName"/> is null, throws an exception.</summary> /// <param name="userName">The user's name.</param> public void Process(string userName) { } /// <summary>Compares <paramref name="firstValue"/> with <paramref name="secondValue"/>.</summary> /// <param name="firstValue">The first value.</param> /// <param name="secondValue">The second value.</param> public bool Compare(int firstValue, int secondValue) { return firstValue == secondValue; }}
[*.cs]# Options: safe, strict, off# safe: Only flags complex names (camelCase, PascalCase, underscores, or digits). Ignores simple lowercase words (default).# strict: Flags all matching parameter names regardless of casing or length.# off: Disables ghost reference detection.comment_sense.ghost_references.mode = safe
By default, only “complex” names (camelCase, PascalCase, or containing underscores/digits) are flagged. Simple lowercase words are ignored to reduce false positives.
/// <summary>/// A generic collection where TElement represents the element type. // CSENSE021 on 'TElement'/// </summary>/// <typeparam name="TElement">The type of elements in the collection.</typeparam>public class MyCollection<TElement>{}
Correct example
/// <summary>/// A generic collection where <typeparamref name="TElement"/> represents the element type./// </summary>/// <typeparam name="TElement">The type of elements in the collection.</typeparam>public class MyCollection<TElement>{}