コメント(C#)
コードの意図や仕様を記述する「コメント」の構文です。『C#』には // による一行コメント、/* */ によるブロックコメント、/// による XML ドキュメントコメントの3種類があります。XML ドキュメントコメントは IDE がドキュメントとして解析・表示するため、クラスやメソッドの公開 API に付けるのが一般的です。
構文
C# のコメント記法は以下の3種類です。
// 一行コメントです。// 以降、行末まですべてコメントになります。 // 複数行に書く場合はそれぞれの行頭に // を付けます。/* ブロックコメントです。 複数行にわたってコメントを書きたいときに使います。 /* をネストすることはできません。 */ /// <summary> /// XML ドキュメントコメントです。クラス・メソッド・プロパティの直前に書きます。 /// </summary> /// <param name="パラメータ名">パラメータの説明。</param> /// <returns>戻り値の説明。</returns> /// <remarks>補足情報。</remarks> /// <example>使用例。</example>
コメントの種類と用途
| 種類 | 記法 | 主な用途 |
|---|---|---|
| 一行コメント | // | コードの横や上に短い説明を添える。 |
| ブロックコメント | /* */ | 複数行にわたる説明。コードの一時的な無効化(コメントアウト)。 |
| XML ドキュメントコメント | /// | クラス・メソッド・プロパティの公開 API に仕様を記述。IDE のツールチップや XML ドキュメント生成に使われます。 |
主な XML ドキュメントコメントタグ
| タグ | 説明 |
|---|---|
<summary> | クラス・メソッド・プロパティの概要を記述します。最も基本的なタグです。 |
<param name="名前"> | メソッドのパラメータを説明します。name 属性に引数名を指定します。 |
<returns> | 戻り値の内容を説明します。 |
<remarks> | 補足情報や注意事項を記述します。 |
<example> | 使用例を記述します。 |
<exception cref="型名"> | スローされる可能性のある例外を記述します。 |
<see cref="型名"> | 別のクラスやメンバーへの参照リンクを作ります。 |
<code> | インラインでコードを記述します。 |
サンプルコード
CommentBasic.cs
一行コメントとブロックコメントの使い方を示すサンプルです。
using System;
class CommentBasic {
static void Main() {
// --- 一行コメント(//)の基本 ---
// // 以降、行末まですべてコメントとして扱われます。
string name = "孫悟空"; // 変数の右にも書けます。
// 複数行にわたる説明は各行頭に // を付けます。
// 後の処理で変身倍率をかけて計算します。
int power = 9000;
Console.WriteLine(name + "の戦闘力: " + power);
// --- ブロックコメント(/* */)の基本 ---
/* ブロックコメントは /* と */ で囲んだ範囲がすべてコメントになります。
複数行にわたる長い説明を書く際に使います。
ただし /* はネストできないため、コメント内に /* を書くことはできません。 */
// コードを一時的に無効化(コメントアウト)するときにもよく使います。
/* デバッグ中は以下の行を無効化しています。
Console.WriteLine("デバッグ出力: " + power);
*/
// --- 型ヒントとコメントの使い分け ---
// C# は静的型付き言語なので型は宣言で明確です。
// コメントには「何をするか」ではなく「なぜそうするか」を書くと有益です。
var multiplier = 50;
// var を使うと型が推論されます。型が自明でない場合はコメントで補足します。
var ssjPower = power * multiplier;
Console.WriteLine("超サイヤ人時の戦闘力: " + ssjPower);
}
}
コンパイルして実行すると次のようになります。
dotnet script CommentBasic.cs 孫悟空の戦闘力: 9000 超サイヤ人時の戦闘力: 450000
XmlDocComment.cs
XML ドキュメントコメントを使ってクラスとメソッドを文書化するサンプルです。
using System;
/// <summary>
/// </summary>
class Fighter {
/// <summary>キャラクターの名前です。</summary>
public string Name { get; }
/// <summary>基本戦闘力です。変身前の素の値が入ります。</summary>
public int BasePower { get; }
/// <summary>種族名です(例: サイヤ人、ナメック星人)。</summary>
public string Race { get; }
/// <summary>
/// </summary>
/// <param name="name">キャラクターの名前。</param>
/// <param name="basePower">変身前の基本戦闘力。0以上の値を指定してください。</param>
/// <param name="race">キャラクターの種族名。</param>
public Fighter(string name, int basePower, string race) {
Name = name;
BasePower = basePower;
Race = race;
}
/// <summary>
/// </summary>
/// <param name="multiplier">
/// 変身倍率。1より大きい値を指定します。
/// 例: 超サイヤ人は50、超サイヤ人2は100。
/// </param>
/// <returns>変身後の戦闘力(BasePower × multiplier)。</returns>
/// <remarks>
/// 倍率に1を指定すると変身していない状態と同じ値になります。
/// 0以下の倍率を渡した場合の動作は未定義です。
/// </remarks>
public int GetTransformedPower(int multiplier) {
return BasePower * multiplier; // 基本戦闘力に変身倍率をかけます。
}
/// <summary>
/// キャラクター情報を整形した文字列で返します。
/// </summary>
/// <returns>"名前(種族): 戦闘力 XXXX" 形式の文字列。</returns>
public string GetInfo() {
return Name + "(" + Race + "): 戦闘力 " + BasePower;
}
}
class XmlDocComment {
static void Main() {
// IDE では new Fighter( と入力した時点でパラメータの説明がツールチップ表示されます。
var goku = new Fighter("孫悟空", 9000, "サイヤ人");
var vegeta = new Fighter("ベジータ", 8000, "サイヤ人");
var piccolo = new Fighter("ピッコロ", 3500, "ナメック星人");
// GetInfo() にカーソルを合わせると <summary> の内容が IDE に表示されます。
Console.WriteLine(goku.GetInfo());
Console.WriteLine(vegeta.GetInfo());
Console.WriteLine(piccolo.GetInfo());
Console.WriteLine();
// GetTransformedPower にカーソルを合わせると引数・戻り値の説明も表示されます。
int ssjMultiplier = 50;
int ssj2Multiplier = 100;
Console.WriteLine(goku.Name + " 超サイヤ人: 戦闘力 "
+ goku.GetTransformedPower(ssjMultiplier));
Console.WriteLine(vegeta.Name + " 超サイヤ人2: 戦闘力 "
+ vegeta.GetTransformedPower(ssj2Multiplier));
}
}
コンパイルして実行すると次のようになります。
dotnet script XmlDocComment.cs 孫悟空(サイヤ人): 戦闘力 9000 ベジータ(サイヤ人): 戦闘力 8000 ピッコロ(ナメック星人): 戦闘力 3500 孫悟空 超サイヤ人: 戦闘力 450000 ベジータ 超サイヤ人2: 戦闘力 800000
よくあるミス
ブロックコメントのネスト
C# のブロックコメント /* */ はネストできません。コメント内に /* を書いても無視され、最初に出現する */ でコメントが終了します。大きなコードブロックをコメントアウトする際に、内部に既存のブロックコメントがあるとコンパイルエラーになります。
/* 外側のコメント開始 /* 内側のコメント(ネスト不可) */ この行はコメント外として扱われ、コンパイルエラーになります。 */
この問題を避けるには、コメントアウトに // を使うか、IDE のコメントアウト機能(複数行選択 → Ctrl+/ など)を活用してください。
XML ドキュメントコメントを private メンバーに付ける
XML ドキュメントコメント(///)はコンパイラが解析してドキュメント XML を生成しますが、デフォルトでは public / protected メンバーのみが対象です。private メンバーに付けても IDE のツールチップには表示されますが、外部ドキュメントには出力されません。クラス内部の private メソッドには // コメントで十分な場合が多いです。
概要
『C#』のコメントは3種類あります。// は最もよく使う一行コメントです。/* */ はブロック範囲をまとめてコメントにできますが、ネストはできないため注意してください。/// の XML ドキュメントコメントは Visual Studio や Rider などの IDE がツールチップとして表示してくれるため、公開 API(public なクラス・メソッド・プロパティ)に付けることが推奨されています。
XML ドキュメントコメントでは <summary> が最も基本的なタグです。メソッドに引数がある場合は <param>、戻り値がある場合は <returns> を合わせて記述するとドキュメントとして完成します。IDE の補完候補に説明が出るようになり、チームでの開発効率が上がります。
C# は静的型付き言語なので、型そのものを説明するコメントは基本的に不要です。// int 型の変数です のような型を再説明するコメントは冗長で、むしろ「なぜその値なのか」「なぜその処理が必要なのか」という意図をコメントに書くと読みやすいコードになります。var を使って型が非自明になる場面ではコメントで補足すると可読性が高まります。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。