Suponha que eu tenha esta interface
public interface IFoo
{
///<summary>
/// Foo method
///</summary>
void Foo();
///<summary>
/// Bar method
///</summary>
void Bar();
///<summary>
/// Situation normal
///</summary>
void Snafu();
}
E esta aula
public class Foo : IFoo
{
public void Foo() { ... }
public void Bar() { ... }
public void Snafu() { ... }
}
Existe uma maneira ou existe uma ferramenta que pode me deixar colocar automaticamente os comentários de cada membro em uma classe base ou interface?
Porque eu odeio reescrever os mesmos comentários para cada subclasse derivada!
c#
inheritance
comments
jumpinjackie
fonte
fonte
Respostas:
GhostDoc faz exatamente isso. Para métodos que não são herdados, ele tenta criar uma descrição a partir do nome.
FlingThing()
torna-se"Flings the Thing"
fonte
<summary>
,<param>
,<returns>
,<throws>
,etc...
seções para você. Muitas vezes com resultados bons o suficiente; outras vezes, precisando de correções ou expansão, mas ainda reduzindo o esforço geral.Você sempre pode usar
<inheritdoc />
tag.fonte
Use
/// <inheritdoc/>
se quiser herança. Evite GhostDoc ou algo parecido.Concordo que é irritante que os comentários não sejam herdados. Seria um suplemento bastante simples de criar se alguém tivesse tempo (gostaria de ter).
Dito isso, em nossa base de código, colocamos comentários XML apenas nas interfaces e adicionamos comentários de implementação extras à classe. Isso funciona para nós, pois nossas classes são privadas / internas e apenas a interface é pública. Sempre que usamos os objetos por meio das interfaces, temos todos os comentários exibidos na inteligência.
GhostDoc é um bom começo e tornou o processo mais fácil de escrever comentários. É especialmente útil manter os comentários atualizados ao adicionar / remover parâmetros, executar novamente o GhostDoc e ele atualizará a descrição.fonte
<param name="origin">The origin.</param>
. Veja ghostdoc diz as coisas mais malditas para mais exemplos. O Visual Studio agora tem linting e geradores muito melhores para xmldocs para que você saiba quando os parâmetros + documentos não se alinham, então o GhostDoc (ou outras ferramentas) não são mais necessários.Java tem isso e eu uso o tempo todo. Apenas faça:
E a ferramenta Javadoc descobre isso.
C # tem marcador semelhante:
Você pode ler mais aqui:
http://www.ewoodruff.us/shfbdocs/html/79897974-ffc9-4b84-91a5-e50c66a0221d.htm
fonte
<inheritdoc/>
marcador: o Sandcastle tem. shfb.codeplex.comEu diria para usar diretamente o
E
Você deve colocar esses comentários apenas na linha anterior de sua classe / método
Isso obterá as informações de seus comentários, por exemplo, de uma interface que você documentou como:
fonte
Resharper tem a opção de copiar os comentários da classe base ou interface.
fonte
Outra maneira é usar a
<see />
tag de documentação XML. Este é um esforço extra, mas funciona fora da caixa ...aqui estão alguns exemplos:
Atualizar:
Agora prefiro usar o
/// <inheritdoc/>
que agora é compatível com ReSharper.fonte
Acabei criando uma ferramenta para pós-processar os arquivos de documentação XML para adicionar suporte para a substituição da
<inheritdoc/>
tag nos próprios arquivos de documentação XML. Disponível em www.inheritdoc.io (versão gratuita disponível).fonte
Bem, existe um tipo de solução nativa que encontrei para o .NET Core 2.2
A ideia é usar
<include>
tag.Você pode adicionar
<GenerateDocumentationFile>true</GenerateDocumentationFile>
seu.csproj
arquivo.Você pode ter uma interface:
E algo que herda disso:
Ok, é um pouco assustador, mas adiciona os elementos esperados ao
YourNamespace.xml
.Se você construir
Debug
a configuração, você pode trocarRelease
paraDebug
nofile
atributo dainclude
tag.Para encontrar uma referência correta
member
,name
basta abrir oDocumentation.xml
arquivo gerado .Também presumo que essa abordagem requer que um projeto ou solução seja compilado pelo menos duas vezes (a primeira vez para criar um arquivo XML inicial e a segunda vez para copiar elementos dele para si mesmo).
O lado bom é que o Visual Studio valida os elementos copiados, então é muito mais fácil manter a documentação e o código em sincronia com a interface / classe base, etc (por exemplo, nomes de argumentos, nomes de parâmetros de tipo, etc).
No meu projeto, terminei com
<inheritdoc/>
(para DocFX) e<include/>
(para publicação de pacotes NuGet e para validação no Visual Studio):fonte