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#] プラグインで拡張できるアプリケーションを設計する Jul 9, 2026
  • [C#] 属性でコードに意味を与える Jul 8, 2026
  • [C#] 外部アセンブリを読み込み実行時に型を呼び出す Jul 7, 2026

Table of Contents

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

Recent Posts

  • [C#] プラグインで拡張できるアプリケーションを設計する Jul 9, 2026
  • [C#] 属性でコードに意味を与える Jul 8, 2026
  • [C#] 外部アセンブリを読み込み実行時に型を呼び出す Jul 7, 2026
  • [C#] リフレクションで型の中身を調べる Jul 6, 2026
  • [C#] 型メタデータとリフレクションの基礎を理解する Jul 5, 2026

Categories

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

Tags

  • C#
  • .NET
  • AWS
  • Laravel
  • コレクション
  • PHP
  • セキュリティ
  • MySQL
  • Linux
  • パフォーマンス
  • Apache
  • System.Collections.Generic
  • デリゲート
  • Code Snippet
  • DynamoDB
  • LINQ
  • NoSQL
  • PHP-FPM
  • RDS
  • System.Collections
  • Windows
  • メモリ管理
  • リフレクション
  • DoS
  • Nginx
  • WordPress
  • メタデータ
  • ラムダ式
  • 監視
  • 設計
  • Amazon Linux 2023
  • Delegate
  • Docker
  • IDisposable
  • Ipset
  • Iptables
  • LINQ to Objects
  • OPCache
  • Pointer
  • Reflection
  • System.Collections.Specialized
  • Unsafe
  • Webサーバー
  • インターフェース
  • オブジェクト指向
  • クラス設計
  • デザインパターン
  • パターンマッチング
  • ポインター
  • 継承
Powered by Hugo & Explore Theme.