メソッドの冒頭で引数の 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 系メソッドに統一することで、ボイラープレートを減らしつつ意図を明確に伝えられます。