Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

C# 公式 API リファレンスっぽくなるサマリーの書き味について考える

0
Last updated at Posted at 2026-08-22

はじめに

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 クラスを作りました。

IPerson.cs
namespace SummaryExample.ClassLibrary;

/// <summary>
/// 人を表します。
/// </summary>
public interface IPerson
{
    /// <summary>
    /// 名前を取得します。
    /// </summary>
    public string Name { get; }

    /// <summary>
    /// 年齢を取得または設定します。
    /// </summary>
    public int Age { get; set; }
}

User クラスでは、インターフェイスから継承したメンバーについては <inheritdoc/> を使用することで、XML コメントを継承できます。

User.cs
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 リファレンスがあるので、参考になります。

App.xaml.cs
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 を使用しています。

MainWindow.cs
using System.Windows;

namespace SummaryExample.Wpf;

/// <summary>
/// アプリケーションのメインウィンドウを提供します。
/// </summary>
public partial class MainWindow : Window
{
    /// <summary>
    /// <see cref="MainWindow"/> クラスの新しいインスタンスを初期化します。
    /// </summary>
    public MainWindow()
    {
        InitializeComponent();
    }
}
MainViewModel.cs
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 リファレンスがあります。

Program.cs
namespace SummaryExample.Forms;

/// <summary>
/// アプリケーションのエントリポイントを定義します。
/// </summary>
internal static class Program
{
    /// <summary>
    /// アプリケーションのエントリポイントです。
    /// </summary>
    [STAThread]
    private static void Main()
    {
        ApplicationConfiguration.Initialize();
        Application.Run(new MainForm());
    }
}

次はフォームクラスです。イベントやイベントハンドラーの公式 API リファレンスを参考にしながら、考えていきます。

MainForm.cs
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 が生成されます。

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 パラメーターの説明の実例は以下にありました。

HomeController.cs
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 });
    }
}

おわりに

自分一人で作るときの、ちょっとしたこだわりってやつです。

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?