Product Comparisons
Below is a comparison of a group of similar Documentation Comment generation tools. As far as we are aware, these
are the currently available releases of the tools. We have tried to be totally objective, so if anything is missing
or incorrect in this table, please let us know and we'll double-check our facts.
The systems compared below are:
- VS: the built-in Visual Studio 2010 system (type /// (C#) or ''' (VB) and Visual Studio creates a skeleton documentation comment for you)
- ND: .NET Documentor (1.0)
- CM: CommentMaker (1.9.8)
- GD: GhostDoc (3.0.10340),
- GDP: GhostDoc Pro (3.0.10340),
- AU: AtomineerUtils (7.48),
Note that some popular commercial add-ins advertise that they include code-documentation support features.
However, these add-ins are not specialised for documentation, and generally offer only very primitive support
in this area (typically insertion of fixed 'boilerplate' comment blocks). As such, they are not directly
comparable to the documentation-specific add-ins listed here.
| Supported Languages | VS | ND | CM | GD | GDP | AU |
| Visual Basic |  |  | - |  |  |  |
| C# |  |  | - |  |  |  |
| C++/CLI | - |  |  | - | - |  |
| C++ | - | - |  | - | - |  |
| C | - | - | - | - | - |  |
| Java | - | - | - | - | - |  |
| Configurable comment generation for any other filetype | - | - | - | - | - |  |
| Supported Documentation Formats | VS | ND | CM | GD | GDP | AU |
| Documentation XML |  |  | - |  |  |  |
| Doxygen | - | - |  | - | - |  |
| JavaDoc | - | - | - | - | - |  |
| Qt | - | - | - | - | - |  |
| Documentation Block Features | VS | ND | CM | GD | GDP | AU |
| Generate new Doc Comment block |  |  |  |  |  |  |
| Create comments for all code elements in a type/file in one pass | - |  |  | - |  |  |
| Create comments for all code elements in a project in one pass | - |  |  | - | - | - |
| Support single-line comment format, e.g. /// ... |  |  |  |  |  |  |
| Support multi-line comment format, e.g. /** ... */ | - | - |  | - | - |  |
| Optionally place a #region around the doc comment | - | - | - | - | - |  |
| Optionally place a #region around the entire code element | - | - | - | - | - |  |
| Optional, configurable top/bottom separator lines | - | - |  | - | - |  |
| Configurable whitespace within the comment block | - | - |  | - | - |  |
| Configurable whitespace above/below the comment block | - | - | - | - | - |  |
| Configurable ordering of block elements |  | - |  | - |  |  |
| Configurable and custom documentation tags/commands | - | - |  | - | - |  |
| Optionally only document public/protected/internal | - | - | - | - | - |  |
| Independent configuration settings per-Solution or per-Project | - | - | - | - | - |  |
| Documentation Entry Features | VS | ND | CM | GD | GDP | AU |
| Word-wrap entry text | - | - | - | - | - |  |
| File header comments | - | - |  | - | - |  |
| File footer comments | - | - | - | - | - |  |
| Namespace comments | - | - | - | - | - |  |
| Member variable summary | - | - | - | - | - |  |
| Class summary | - | - | - | - | - |  |
| Generic Class type-parameters | - | - | - |  |  |  |
| Interface summary | - | - | - | - | - |  |
| Enum summary | - | - | - | - | - |  |
| Enum entry summary | - | - | - | - | - |  |
| Struct summary | - | - | - | - | - |  |
| Union summary | - | - | - | - | - |  |
| Typedef summary | - | - | - | - | - |  |
| #define summary | - | - | - | - | - |  |
| Method (Sub/Function) summary | - | - | - |  |  |  |
| Method parameters | - | - | - |  |  |  |
| Method [in,out] parameters | - | - |  | - | - |  |
| Method [optional] parameters | - | - | - | - | - |  |
| Generic Method type-parameters | - | - | - |  |  |  |
| Template type-parameters | - | - | - | - | - |  |
| Method exceptions thrown | - | - | - | - | - |  |
| Method returns | - | - | - |  |  |  |
| Property summary | - | - | - |  |  |  |
| Property value | - | - | - | - | - |  |
| Indexer summary | - | - | - |  |  |  |
| Indexer value | - | - | - | - | - |  |
| Events & Event Handlers | - | - | - |  |  |  |
| Delegates | - | - | - | - | - |  |
| Extension methods | - | - | - | - | - |  |
| Code element declaration support (Doxygen) | - | - |  | - | - |  |
| Class/Interface <seealse cref='base-class'/> entries | - |  | - | - | - |  |
| Overridden method/property <seealso cref='base-method'/> entries | - |  | - | - | - |  |
| Deriving documentation from existing documentation | VS | ND | CM | GD | GDP | AU |
| Copy base class method documentation to derived class override | - |  | - |  |  |  |
| Copy interface method documentation to derived class implementation | - |  | - |  |  |  |
| Copy best-match method documentation to sibling overloaded methods | - | - | - | - | - |  |
| Copy best-match parameter documentation to parameters in other methods | - | - | - | - | - |  |
| Auto-generation engines | VS | ND | CM | GD | GDP | AU |
| Documentation-generation rules | 0 | 0 | 0 | ~203 | ~203 | 2019 |
| Abbreviation expansions | 0 | 0 | 0 | 0 | 0 | 476 |
| 'of the' reordering | - | - | - |  |  |  |
| a/an/the correction | - | - | - | - | - |  |
| Pluralisation | - | - | - |  |  |  |
| Punctuation correction | - | - | - | - | - |  |
| Prefix (e.g. 'm_member', '_member', 'IInterface', 'CClass', 'TType') cleanup | - | - | - | - | - |  |
| Documentation Block Updating | VS | ND | CM | GD | GDP | AU |
| Easy update (allow cursor to be in lines/comments above the code element to update) | - | - | - | - | - |  |
| Update comments for all code elements in a type/file in one pass | - |  | - | - |  |  |
| Update comments for all code elements in a project in one pass | - |  | - | - | - | - |
| Update declaration entries to match edited method signature (Doxygen) | - | - | - | - | - |  |
| Update 'typeparam' and 'param' entries to match edited method signature | - | - | - |  |  |  |
| Update 'returns' entries to match edited method signature | - | - | - | - | - |  |
| Update 'exception' entries to match exceptions thrown in method | - | - | - | - | - |  |
| Update property description (gets, sets, gets or sets) to match implementation | - | - | - | - | - |  |
| Update indexer description (get, set, get or set) to match implementation | - | - | - | - | - |  |
| Word-wrap user-edited documentation entries | - | - | - | - | - |  |
| Optionally convert <, >, & into legal XML/HTML entities | - | - | - | - | - |  |
| Enforce whitespace rules | - | - | - | - | - |  |
| Enforce user-defined entry ordering | - | - | - | - | - |  |
| Configurable removal of 'illegal' block elements | - | - | - | - | - |  |
| Support for custom entry types | - | - | - | - | - |  |
| Documentation Block Conversions | VS | ND | CM | GD | GDP | AU |
| Convert between different block styles and layouts | - | - | - | - | - |  |
| Convert between DocXML, Doxygen, Javadoc and Qt formats | - | - | - | - | - |  |
| User-editable (VB) macros to allow conversion of legacy comment blocks | - | - | - | - | - |  |
| Documentation/Comment Block Live Editing Helpers | VS | ND | CM | GD | GDP | AU |
| Create a new doc-comment as /// (C#) or ''' (VB) is typed |  | - | - | - | - |  |
| Create a new doc-comment as /// (C++/CLI, C++, C, Java) is typed | - | - | - | - | - |  |
| Continue comment block with correct indentation when newlines are typed | - | - | - | - | - |  |
| Automatically extend bullet-lists when newlines are typed in comments | - | - | - | - | - |  |
| Automatically reformat pasted text to integrate it into comments | - | - | - | - | - |  |
Generated documentation comparison
Quite a number of add-ins are available that build some form of documentation blocks automatically. However,
almost every one of these add-ins provides only the most basic features - typically they provide empty comments,
sometimes populated with fixed text for a few specific code elements (such as constructors). Only GhostDoc and
AtomineerUtils (to our knowledge) are capable of documenting a wide range of code elements in a context-sensitive manner.
Some typical comments from these two add-ins are shown below, to give a rough idea of the quality of documentation
they produce.
public float CalcSalesTax(List<float> priceList) |
|---|
| | GhostDoc | AtomineerUtils |
|
summary
|
Calcs the sales tax.
|
Calculates the sales tax.
|
|
priceList
|
The price list.
|
List of prices.
|
|
returns
|
-
|
The calculated sales tax.
|
| | GhostDoc | AtomineerUtils |
|
summary
|
Gets the num users.
|
Gets the number of users.
|
|
value
|
-
|
The total number of users.
|
int Min(int value1, int value2, int value3) |
|---|
| | GhostDoc | AtomineerUtils |
|
summary:
|
Mins the specified value1.
|
Determines the minimum of the given parameters.
|
|
value1
|
The value1.
|
The first value.
|
|
value2
|
The value2.
|
The second value.
|
|
value3
|
The value3.
|
The third value.
|
public static bool Contains(this string[] textList, string textToFind)
{
if (textList.Length == 0)
throw new InvalidOperationException("textList cannot be empty");
} |
|---|
| | GhostDoc | AtomineerUtils |
|
summary
|
Determines whether [contains] [the specified text list].
|
A string extension method that determines if this collection contains a given object.
|
|
Invalid operation exception
|
-
|
Thrown when the requested operation is invalid.
|
|
textList
|
The text list.
|
The textList to act on.
|
|
textToFind
|
The text to find.
|
The text to find.
|
|
returns
|
<c>true</c> if [contains] [the specified text list]; otherwise, <c>false</c>
|
true if the object is in this collection, false if not.
|
|