bucket-sort logo bucket-sort

プログラミングとインフラエンジニアリングの覚え書き

  • Posts
  • About
  • Contact
  1. Home
  2. All Posts
  3. [C#] ArgumentNullException.ThrowIfNull で null チェックを 1 行に

[C#] ArgumentNullException.ThrowIfNull で null チェックを 1 行に

Apr 12, 2026 C# , .NET bucket-sort

メソッドの冒頭で引数の null チェックを行うのは C# の定番パターンです。.NET 6 では ArgumentNullException.ThrowIfNull が追加され、従来 3〜4 行かかっていたガード節を 1 行で書けるようになりました。

従来の書き方

void Send(string message)
{
    if (message == null)
    {
        throw new ArgumentNullException(nameof(message));
    }

    // 処理...
}

nameof(message) を渡すことで、例外メッセージに引数名("message")が含まれます。正しく書くと最低 5 行必要で、ガード節が複数あるとメソッドの冒頭が膨らみがちでした。

ArgumentNullException.ThrowIfNull(.NET 6)

void Send(string message)
{
    ArgumentNullException.ThrowIfNull(message);

    // 処理...
}

ThrowIfNull に引数を渡すだけで、message が null の場合に ArgumentNullException をスローします。引数名は CallerArgumentExpression 属性によってコンパイラが自動で取得するため、nameof を手で書く必要はありません。

シグネチャ

public static void ThrowIfNull(
    [NotNull] object? argument,
    [CallerArgumentExpression(nameof(argument))] string? paramName = null);
  • argument が null でなければ何もしない
  • null であれば ArgumentNullException(paramName) をスローする
  • paramName はコンパイラが呼び出し元の式名を自動で埋める

動作確認

string? value = null;
ArgumentNullException.ThrowIfNull(value);
// System.ArgumentNullException: Value cannot be null. (Parameter 'value')

エラーメッセージのパラメータ名が "value" と正しく出力されます。

複数引数のガード節

void Register(string username, string email, object role)
{
    ArgumentNullException.ThrowIfNull(username);
    ArgumentNullException.ThrowIfNull(email);
    ArgumentNullException.ThrowIfNull(role);

    // 処理...
}

従来であれば各引数に if / throw ブロックが必要でしたが、すっきり並べられます。

関連スローヘルパー

.NET 7・8 では ArgumentNullException.ThrowIfNull と同じ思想で追加されたヘルパーが増えています。

ArgumentException(.NET 7)

メソッド スロー条件
ArgumentException.ThrowIfNullOrEmpty(s) null または空文字列
ArgumentException.ThrowIfNullOrWhiteSpace(s) null・空文字列・空白のみ
void SetName(string name)
{
    ArgumentException.ThrowIfNullOrEmpty(name);
    ArgumentException.ThrowIfNullOrWhiteSpace(name);
}

ArgumentOutOfRangeException(.NET 8)

メソッド スロー条件
ThrowIfZero(value) 0
ThrowIfNegative(value) 負の値
ThrowIfNegativeOrZero(value) 0 以下
ThrowIfGreaterThan(value, other) value > other
ThrowIfLessThan(value, other) value < other
ThrowIfEqual(value, other) value == other
ThrowIfNotEqual(value, other) value != other
void Retry(int count, int intervalMs)
{
    ArgumentOutOfRangeException.ThrowIfNegativeOrZero(count);
    ArgumentOutOfRangeException.ThrowIfNegative(intervalMs);
}

まとめ

バージョン メソッド 用途
.NET 6 ArgumentNullException.ThrowIfNull null チェック
.NET 7 ArgumentException.ThrowIfNullOrEmpty null・空文字列チェック
.NET 7 ArgumentException.ThrowIfNullOrWhiteSpace null・空白チェック
.NET 8 ArgumentOutOfRangeException.ThrowIfNegative など 数値範囲チェック

引数のガード節は ThrowIfNull 系メソッドに統一することで、ボイラープレートを減らしつつ意図を明確に伝えられます。

C# .NET 例外処理 Nullチェック ArgumentNullException
← [C#] Named Arguments(名前付き引数) [C#] enum を深掘りする — 基本・ストレージサイズ・System.Enum・Flags・Bitwise →

Related Posts

  • [C#] checked キーワードで整数オーバーフローを検出する Apr 3, 2026
  • [C#] Finalizable & Disposable パターン実践 — Dispose パターンの完全形 May 13, 2026
  • [C#] Disposable Objects — IDisposable / Dispose() と using 構文 May 12, 2026
  • [C#] Finalizable Objects — Finalize() の役割と使いどころ May 11, 2026

Table of Contents

  • 従来の書き方
  • ArgumentNullException.ThrowIfNull(.NET 6)
    • シグネチャ
    • 動作確認
  • 複数引数のガード節
  • 関連スローヘルパー
    • ArgumentException(.NET 7)
    • ArgumentOutOfRangeException(.NET 8)
  • まとめ

Recent Posts

  • [C#] Finalizable & Disposable パターン実践 — Dispose パターンの完全形 May 13, 2026
  • [C#] Disposable Objects — IDisposable / Dispose() と using 構文 May 12, 2026
  • [C#] Finalizable Objects — Finalize() の役割と使いどころ May 11, 2026
  • [C#] System.GC クラスを整理する — ガベージコレクションを制御するための API May 10, 2026
  • [C#] IComparable と IComparer — オブジェクトの順序比較と複数ソート戦略 May 9, 2026

Categories

  • C#63
  • .NET62
  • AWS27
  • Laravel16
  • Linux15
  • MySQL9
  • Apache8
  • PHP8
  • DynamoDB6
  • セキュリティ6
  • Nginx5
  • WordPress4
  • インフラ4
  • Hugo3
  • .NET Framework1
  • Aurora1
  • Filament1
  • Git1
  • SQS1

Tags

  • C#
  • .NET
  • AWS
  • Laravel
  • PHP
  • セキュリティ
  • MySQL
  • Linux
  • Apache
  • Code Snippet
  • DynamoDB
  • NoSQL
  • PHP-FPM
  • RDS
  • パフォーマンス
  • DoS
  • Nginx
  • Windows
  • WordPress
  • メモリ管理
  • 監視
  • 設計
  • Amazon Linux 2023
  • Docker
  • IDisposable
  • Ipset
  • Iptables
  • OPCache
  • Webサーバー
  • オブジェクト指向
  • クラス設計
  • コレクション
  • デザインパターン
  • パターンマッチング
  • 継承
  • 認可
  • Aurora
  • Blade
  • Grafana
  • Hugo
  • InfluxDB
  • Policy
  • Record
  • SSG
  • インターフェース
  • エラーハンドリング
  • カプセル化
  • ガベージコレクション
  • モニタリング
  • 例外
Powered by Hugo & Explore Theme.