はじめに
Microsoft Learn の API リファレンスっぽくなる書き方について考えてみました。
改訂履歴
- 2026/08/15 : 初版公開。
本文
1. 環境
- .NET 8.0
- Visual Studio Community 2022
2. 調査
普段よく使いそうな型の API リファレンスを確認しました。
2-1. <summary>
| 型 | 型名 | 内容 |
|---|---|---|
interface |
IAsyncResult |
非同期操作の状態を表します。 |
interface |
IComparable<T> |
インスタンスを並べ替えたり並べ替えたりするための型固有の比較メソッドを作成するために、値の型またはクラスが実装する一般化された比較メソッドを定義します。 |
interface |
IComponent |
すべてのコンポーネントに必要な機能を提供します。 |
interface |
IDisposable |
アンマネージリソースを解放するためのメカニズムを提供します。 |
interface |
IEnumerable<T> |
列挙子を公開します。この列挙子は、指定した型のコレクションに対する単純な反復処理をサポートします。 |
interface |
IEquatable<T> |
インスタンスの等価性を判断するための型固有のメソッドを作成するために値型またはクラスが実装する一般化されたメソッドを定義します。 |
class |
Control |
ビジュアル表現を持つコンポーネントであるコントロールの基本クラスを定義します。 |
class |
Controller |
ビューをサポートする MVC コントローラーの基本クラス。 |
class |
HttpClient |
URI によって識別されるリソースから HTTP 要求を送信し、HTTP 応答を受信するためのクラスを提供します。 |
class |
Task |
非同期操作を表します。 |
class |
TcpClient |
TCP ネットワークサービスのクライアント接続を提供します。 |
class |
TcpListener |
TCP ネットワーククライアントからの接続をリッスンします。 |
struct |
DateTime |
一時的な時間を表します。通常は、日付と時刻として表されます。 |
struct |
TimeSpan |
時間間隔を表します。 |
enum |
StringComparison |
Compare(String, String) メソッドおよび Equals(Object) メソッドの特定のオーバーロードで使用されるカルチャ、大文字と小文字、並べ替えの規則を指定します。 |
2-2. 引数 <param>
2-3. 戻り値 <returns>
| 型 | 関数名 | 内容 |
|---|---|---|
Task<Byte[]> |
HttpClient.GetByteArrayAsync |
非同期操作を表すタスクオブジェクト。 |
Task<Int32> |
DbCommand.ExecuteNonQueryAsync |
非同期操作を表すタスク。 |
Task<Socket> |
Socket.AcceptAsync |
受け入れられたソケットで完了する非同期タスク。 |
Task<String> |
StreamReader.ReadToEndAsync |
非同期読み取り操作を表すタスク。TResult パラメーターの値には、現在の位置からストリームの末尾までの文字を含む文字列が含まれています。 |
ValueTask<Boolean> |
IAsyncEnumerator<T>.MoveNextAsync |
列挙子が次の要素に正常に進んだ場合、または列挙子がコレクションの末尾を通過した場合に ValueTask<TResult> true の結果で完了する false。→ ValueTask<TResult>。これは、列挙子が次の要素へ正常に遷移した場合は true を、列挙子がコレクションの末尾を過ぎた場合は false を結果として返します(さすがに文章として崩壊しているので意訳しました)。 |
3. 実装
3-1. C#
サンプルとして IPerson とそれを実装する User クラスを作りました。
namespace SummaryExample.ClassLibrary;
/// <summary>
/// 人を表します。
/// </summary>
public interface IPerson
{
/// <summary>
/// 名前を取得します。
/// </summary>
public string Name { get; }
/// <summary>
/// 年齢を取得または設定します。
/// </summary>
public int Age { get; set; }
}
User クラスでは、インターフェイスから継承したメンバーについては <inheritdoc/> を使用することで、XML コメントを継承できます。
namespace SummaryExample.ClassLibrary;
/// <summary>
/// ユーザーを表します。
/// </summary>
public class User : IPerson
{
/// <summary>
/// <see cref="User"/> クラスの新しいインスタンスを初期化します。
/// </summary>
/// <param name="name">ユーザー名。</param>
/// <param name="age">ユーザーの年齢。</param>
/// <param name="isActive">ユーザーがアクティブかどうかを示す値。</param>
/// <param name="registeredAt">ユーザーの登録日時。</param>
public User(string name, int age, bool isActive, DateTime registeredAt)
{
Name = name;
Age = age;
IsActive = isActive;
RegisteredAt = registeredAt;
}
/// <inheritdoc/>
public string Name { get; }
/// <inheritdoc/>
public int Age { get; set; }
/// <summary>
/// ユーザーがアクティブかどうかを示す値を取得または設定します。
/// </summary>
public bool IsActive { get; set; }
/// <summary>
/// ユーザーの登録日時を取得または設定します。
/// </summary>
public DateTime RegisteredAt { get; set; }
/// <summary>
/// ユーザー情報を表示します。
/// </summary>
public void Display() { }
/// <summary>
/// ユーザーが成人かどうかを判断します。
/// </summary>
/// <returns>ユーザーが成人の場合は <see langword="true"/>、それ以外の場合は <see langword="false"/>。</returns>
public bool IsAdult()
{
return Age >= 18;
}
}
コンストラクターは
<see cref="User"/> クラスの新しいインスタンスを初期化します。
bool 型の戻り値の説明は
ユーザーが成人の場合は <see langword="true"/>、それ以外の場合は <see langword="false"/>。
という形にすると公式 API リファレンスっぽくなります。
3-2. WPF
エントリポイントから考えていきます。Application クラスと OnStartup メソッドには、公式 API リファレンスがあるので、参考になります。
using System.Windows;
namespace SummaryExample.Wpf;
/// <summary>
/// Windows Presentation Foundation アプリケーションを表します。
/// </summary>
public partial class App : Application
{
/// <summary>
/// <see cref="Application.Startup"/> イベントを処理します。
/// </summary>
/// <param name="e">イベントデータを含む <see cref="StartupEventArgs"/>。</param>
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var mainWindow = new MainWindow();
MainWindow = mainWindow;
mainWindow.Show();
}
}
次はビューとビューモデルです。MVVM ライブラリには、個人的にデファクトスタンダードだと思っている CommunityToolkit.Mvvm を使用しています。
using System.Windows;
namespace SummaryExample.Wpf;
/// <summary>
/// アプリケーションのメインウィンドウを提供します。
/// </summary>
public partial class MainWindow : Window
{
/// <summary>
/// <see cref="MainWindow"/> クラスの新しいインスタンスを初期化します。
/// </summary>
public MainWindow()
{
InitializeComponent();
}
}
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
namespace SummaryExample.Wpf;
/// <summary>
/// <see cref="MainWindow"/> の状態管理と操作を提供します。
/// </summary>
public partial class MainViewModel : ObservableObject
{
[ObservableProperty]
private string _title = string.Empty;
[RelayCommand]
private void OpenSettings() { }
}
3-3. Windows Forms
Windows Forms でも、Application クラスの公式 API リファレンスがあります。
namespace SummaryExample.Forms;
/// <summary>
/// アプリケーションのエントリポイントを定義します。
/// </summary>
internal static class Program
{
/// <summary>
/// アプリケーションのエントリポイントです。
/// </summary>
[STAThread]
private static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new MainForm());
}
}
次はフォームクラスです。イベントやイベントハンドラーの公式 API リファレンスを参考にしながら、考えていきます。
namespace SummaryExample.Forms;
/// <summary>
/// アプリケーションのメイン画面を提供します。
/// </summary>
public partial class MainForm : Form
{
/// <summary>
/// <see cref="MainForm"/> クラスの新しいインスタンスを初期化します。
/// </summary>
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e) { }
private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { }
private void OpenSettingsButton_Click(object sender, EventArgs e) { }
}
3-4. ASP.NET
今回は MVC のテンプレートにしました。プロジェクトの作成時「最上位レベルのステートメントを使用しない」にチェックを入れると Program.cs が生成されます。
namespace SummaryExample.AspDotNetMvc;
/// <summary>
/// アプリケーションのエントリポイントを定義します。
/// </summary>
public class Program
{
/// <summary>
/// アプリケーションのエントリポイントです。
/// </summary>
public static void Main(string[] args)
{
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
WebApplication app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
app.Run();
}
}
次はコントローラークラスです。テンプレートで自動生成される HomeController で考えます。なお Controller には公式 API リファレンスがあります。
ILogger パラメーターの説明の実例は以下にありました。
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using SummaryExample.AspDotNetMvc.Models;
namespace SummaryExample.AspDotNetMvc.Controllers;
/// <summary>
/// アプリケーションのホーム画面を提供します。
/// </summary>
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
/// <summary>
/// <see cref="HomeController"/> クラスの新しいインスタンスを初期化します。
/// </summary>
/// <param name="logger">ロガー。</param>
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
/// <summary>
/// ホーム画面のビューを返します。
/// </summary>
public IActionResult Index()
{
return View();
}
/// <summary>
/// プライバシーポリシー画面のビューを返します。
/// </summary>
public IActionResult Privacy()
{
return View();
}
/// <summary>
/// エラー画面のビューを返します。
/// </summary>
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
おわりに
自分一人で作るときの、ちょっとしたこだわりってやつです。