C#のコメント継承(実際には任意の言語)


93

このインターフェイスがあるとしましょう

public interface IFoo
{
    ///<summary>
    /// Foo method
    ///</summary>
    void Foo();

    ///<summary>
    /// Bar method
    ///</summary>
    void Bar();

    ///<summary>
    /// Situation normal
    ///</summary>
    void Snafu();
}

そしてこのクラス

public class Foo : IFoo
{
    public void Foo() { ... }
    public void Bar() { ... }
    public void Snafu() { ... }
}

方法はありますか、または基本クラスまたはインターフェイスの各メンバーのコメントを自動的に入力できるツールはありますか?

派生したサブクラスごとに同じコメントを書き直すのが嫌いだからです!


13
嫌いなだけでなく、同期を保つのも難しいです。
Olivier Jacot-Descombes

回答:


17

GhostDocはまさにそれを行います。継承されていないメソッドについては、名前から説明を作成しようとします。

FlingThing() なる "Flings the Thing"


2
O):GhostDocは、私は私が必要と知りませんでしたが、今なしで行うことができないものの一つ素晴らしいです
NikolaiDante

178
自動生成されたドキュメントは、私にとって非常に悪い考えのようです。それらは有用な情報を追加しませんが、コードを不必要に爆破するだけです。ツールがその名前からメソッドの機能を理解できれば、人も理解でき、ドキュメントは必要ありません。
Lensflare

8
@Lensflareこれは本当です。私はかつて、そのような生成されたコメントのみを持ち、メソッド/クラスに情報を追加しないフレームワークを使用する必要がありました。「このメソッドはこれを実行します」の代わりに、「これはクラスZのメソッドXYです」のようなコメントです。xDまた、コードを参照しなかったので、試行錯誤しました。二度と!:-)
itmuckel 2016

15
@Lensflare AGDをそのまま使用する限り、私は100%同意します、AGDはそのような「すべてを実行する」魔法のボタンとして使用するためのものではないことを指摘しておきます。代わりに、これらはテンプレートジェネレーターとして使用することを目的としており、定型文、繰り返し作成するドキュメントの量を減らし、重要なものに集中できるようにします。---例えば、それが生成することができ<summary><param><returns><throws>etc...あなたのためのセクションを。多くの場合、十分な結果が得られます。その他の場合は、修正または拡張が必要ですが、全体的な労力は削減されます。
XenoRo 2017

4
ドキュメントは開発者向けではなく、アーキテクト向けなので、「おっと、プロジェクトのコードドキュメントを読み込めますか?確かに、ここにあります。」
Trident D'Gao

151

いつでも<inheritdoc />タグを使用できます。

public class Foo : IFoo
{
    /// <inheritdoc />
    public void Foo() { ... }
    /// <inheritdoc />
    public void Bar() { ... }
    /// <inheritdoc />
    public void Snafu() { ... }
}

7
<inheritdoc />が存在することさえ知りませんでした...しかし、私が見る限り、このメソッドのコメントはインテリセンスでは表示されません。
gerleim 2014年

12
@gerleim 1年前のJeff Heatonの回答とその下のコメントを見てください。サンドキャッスルには、C#ではなく<inheritdoc />があります。
rbwhitaker 2015年

4
inheritdocを使用したインテリセンスのインターフェイスからのコメントが表示されます。また、派生クラスにコードドキュメントがない場合も表示されます。しかし、それは私がリシャールを持っているからかもしれません。
Tim Abell 2017年

9
ReSharperの2017.2はinheritdocのための改良されたサポートがあるjetbrains.com/resharper/whatsnewを
ダヴ・エヴァンス

3
Visual Studio Enterprise 2017(バージョン15.9.3)では、継承されたコメントが表示されません。
herzbube

26

/// <inheritdoc/>継承が必要な場合に使用します。GhostDocなどは避けてください。

コメントが継承されないのは不愉快だと私は同意します。誰かが時間を持っていた場合に作成するのはかなり簡単なアドインです(私がそうしたいと思っています)。

つまり、コードベースでは、インターフェイスにのみXMLコメントを配置し、クラスに追加の実装コメントを追加します。クラスはプライベート/内部であり、インターフェースのみがパブリックであるため、これは私たちにとってはうまくいきます。インターフェースを介してオブジェクトを使用するときはいつでも、完全なコメントがインテリジェンスで表示されます。

GhostDocは良いスタートであり、プロセスをコメントを書くことをより簡単にしました。パラメータを追加/削除するときにコメントを最新に保ち、GhostDocを再実行すると、説明が更新されるので特に便利です。


私は混乱しています-あなたはGhostDocを避けると言っていましたが、最終的にはGhostDocが物事を簡単にするのを助けるように承認したようです。どういう意味かわかりますか?
Mike Marynowski

@MikeMarynowskiに感謝します。これは古いアドバイスです。当時、他のジェネレータと同様に、GhostDocにはコメントが追加されるが、ほとんど役に立たない詳細が含まれていると思いました<param name="origin">The origin.</param>。参照のghostdocはdamndest物事言うより多くの例のために。Visual Studioには、パラメーターとドキュメントが揃わなくなったためにGhostDoc(または他のツール)が不要になったことを知らせるために、xmldocsのリンティングとジェネレーターが大幅に改善されました。
デニス

15

Javaにはこれがあり、私はいつもそれを使用しています。ただやる:

/**
 * {@inheritDoc}
 */

そして、Javadocツールはそれを理解します。

C#にも同様のマーカーがあります。

<inheritDoc/>

あなたはここでもっと読むことができます:

http://www.ewoodruff.us/shfbdocs/html/79897974-ffc9-4b84-91a5-e50c66a0221d.htm


37
C#には<inheritdoc/>マーカーがありません。サンドキャッスルにはマーカーがあります。shfb.codeplex.com
Eric

8
C#に<inheritdoc />を追加するためのユーザー音声機能リクエストがあります。visualstudio.uservoice.com/forums/121579-visual-studio/…で
deadlydog

1
C#もJava(またはその他のプログラミング言語)も、 "XML doc"要素を持ちません。これらはコメントです。コンパイラはそれらについて知らない。これらはすべて、javadocやサンドキャッスルなど、サードパーティのドキュメントジェネレーターで厳密に使用されます。
James Curran 2017年

4
JavaまたはC#が記載されている場合、それは通常、関連するツールのコミュニティを意味します。JavaもC#も、文字通りの意味ではあまり機能しません。ランタイムライブラリがデータベースに接続するため、JavaまたはC#にはデータベースに接続する機能がないと述べるのは、学術的な議論になります。
JeffHeaton 2017

2
Visual Studioバージョン16.4.0以降は、<inheritDoc />にインテリセンスを提供します!docs.microsoft.com/en-us/visualstudio/releases/2019/…
ashbygeek

10

私は直接使用すると言います

/// <inheritdoc cref="YourClass.YourMethod"/>  --> For methods inheritance

そして

/// <inheritdoc cref="YourClass"/>  --> For directly class inheritance

あなたはクラス/メソッドの前の行にこのコメントを置く必要があります

これにより、たとえば、以下のように文書化したインターフェースからコメントの情報が取得されます。

    /// <summary>
    /// This method is awesome!
    /// </summary>
    /// <param name="awesomeParam">The awesome parameter of the month!.</param>
    /// <returns>A <see cref="AwesomeObject"/> that is also awesome...</returns>
    AwesomeObject CreateAwesome(WhateverObject awesomeParam);

アドバイスをありがとう!このアプローチはより明示的であり、オブジェクトインターフェイスからの継承クラス記述の問題を解決します(インターフェイスを実装する場合でも)。
Denis Babarykin

8

Resharperには、基本クラスまたはインターフェースからコメントをコピーするオプションがあります。


1
ああ?どうやって?私はReSharperを使用していますが、インターフェイスを実装または継承するときにそのオプションを見たことはありません...それはどこにあり、そのオプションをどのように使用しますか?
Jazimov、2016年

2
@JazimovオーバーライドメソッドをAlt + Enterすると、「ベースからドキュメントをコピー」するオプションがあります。
2016年

8

別の方法は、<see />XMLドキュメントタグを使用することです。これは追加の作業ですが、そのまま使用できます...

ここではいくつかの例を示します。

/// <summary>
/// Implementation of <see cref="IFoo"/>.
/// </summary>
public class Foo : IFoo
{
    /// <summary>
    /// See <see cref="IFoo"/>.
    /// </summary>
    public void Foo() { ... }

    /// <summary>
    /// See <see cref="IFoo.Bar"/>
    /// </summary>
    public void Bar() { ... }

    /// <summary>
    /// This implementation of <see cref="IFoo.Snafu"/> uses the a caching algorithm for performance optimization.
    /// </summary>
    public void Snafu() { ... }
}

更新:

現在/// <inheritdoc/>、ReSharperでサポートされているものを使用することを好みます。


1

最終的に、XMLドキュメントファイルを後処理<inheritdoc/>して、XMLドキュメントファイル自体のタグを置換するためのサポートを追加するツールを作成しました。利用可能なwww.inheritdoc.io(利用可能な無料版)。


0

まあ、ある種のネイティブソリューションがあります。.NETCore 2.2用に見つけました

アイデアは、<include>タグを使用することです。

追加でき<GenerateDocumentationFile>true</GenerateDocumentationFile>ます.csproj Aファイルを。

あなたはインターフェースを持っているかもしれません:

namespace YourNamespace
{
    /// <summary>
    /// Represents interface for a type.
    /// </summary>
    public interface IType
    {
        /// <summary>
        /// Executes an action in read access mode.
        /// </summary>
        void ExecuteAction();
    }
}

そしてそれから継承するもの:

using System;

namespace YourNamespace
{
    /// <summary>
    /// A type inherited from <see cref="IType"/> interface.
    /// </summary>
    public class InheritedType : IType
    {
        /// <include file='bin\Release\netstandard2.0\YourNamespace.xml' path='doc/members/member[@name="M:YourNamespace.IType.ExecuteAction()"]/*'/>
        public void ExecuteAction() => Console.WriteLine("Action is executed.");
    }
}

OK、少し怖いですが、期待される要素がに追加されますYourNamespace.xml

あなたが構築する場合Debugの構成を、あなたは入れ替えることができますReleaseのためDebugfileの属性includeタグ。

正しいを見つけるにはmember「S nameだけ開いて生成された参照するためにDocumentation.xmlファイルを。

また、このアプローチでは、プロジェクトまたはソリューションを少なくとも2回ビルドする必要があると想定しています(最初は最初のXMLファイルを作成し、2回目は要素をファイルからそれ自体にコピーします)。

明るい面は、Visual Studioがコピーされた要素を検証するため、ドキュメントやコードをインターフェイス/基本クラスなど(たとえば、引数の名前、型パラメーターの名前など)と同期させるのがはるかに簡単です。

私のプロジェクトでは、<inheritdoc/>(DocFXの場合)と<include/>(NuGetパッケージの公開およびVisual Studioでの検証の場合)の両方で終了しました。

        /// <inheritdoc />
        /// <include file='bin\Release\netstandard2.0\Platform.Threading.xml' path='doc/members/member[@name="M:Platform.Threading.Synchronization.ISynchronization.ExecuteReadOperation(System.Action)"]/*'/>
        public void ExecuteReadOperation(Action action) => action();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.