フッターコンテンツにスキップ
Iron Academy Logo
C#と.NETの新機能

C# 10と.NET 6で10分以内にNullパラメータをチェックする

Tim Corey
4分49秒

C#で作業しているとき、開発者はメソッドに渡されるNULL引数によく遭遇します。 適切に処理されないと、予期せぬ動作やランタイムエラー、さらには処理されない例外が発生する可能性があります。 ティム・コーリーのビデオ"Null Parameter Checks in C# 10 and .NET 6 in 10 Minutes or Less"では、C# 10 で ArgumentNullException クラスを使用して NULL 値の処理が簡素化されたことを説明しています。

この記事では、Timが説明する通りにビデオを見ながら、NULLチェックがどのように機能し、最新のC#でどのように改善されたかを理解します。

舞台設定 - Null パラメータのチェック

Timはまず、簡単な.NET 6コンソールアプリケーションを作成し、C#でNULLパラメータチェックがどのように処理されるかを示します。 彼は、定型的なコードをクリアし、NULL可能な文字列変数を宣言します:

string? info = null;
string? info = null;

このnullオブジェクトは、メソッド呼び出しが適切にインスタンス化されていない引数を受け取るかもしれないシナリオを表しています。 ティムは、次に簡単な方法を定義します:

void SayHi(string message)
{
    Console.WriteLine($"こんにちは {message}");
}
void SayHi(string message)
{
    Console.WriteLine($"こんにちは {message}");
}

彼はinfo変数をメソッドに渡します:

SayHi(info);
SayHi(info);

プログラムが実行されると、出力は単に表示されます:

こんにちは

文字列連結はNULL値を受け入れ、それを空文字列のように扱うため、例外は発生しません。 しかし、ティムが指摘するように、ほとんどの実世界のメソッドでは、Null参照が下流の問題につながったり、コールスタックの後半でNullReferenceExceptionが発生したりするような、エラーになりやすい状況を引き起こす可能性があります。

堅牢なコードを作成するために、開発者は引数を検証し、どのメソッドも有効で非NULLの入力を期待することを確認する必要があります。

C#10以前の伝統的なヌルチェック

ティムは、C# 10以前は、パラメータを手動でチェックし、必要なときにArgumentNullExceptionを投げるのが良い習慣だったと説明しています。 SayHiメソッドの中で、彼はこう付け加えた:

if (message is null)
    throw new ArgumentNullException(nameof(message));
if (message is null)
    throw new ArgumentNullException(nameof(message));

このチェックは、NULL引数が渡された場合、プログラムが直ちにArgumentNullExceptionクラスの新しいインスタンスを投げることを保証します。

ティムがコードを実行すると、エラーメッセージがはっきりと表示されます:

System.ArgumentNullException: Value cannot be null. (Parameter 'message')
System.ArgumentNullException: Value cannot be null. (Parameter 'message')

この処理されない例外は、メソッドが無効な引数を受け取ったことを示しています。 パラメータ名(この場合は"message")は自動的に出力に表示されるため、開発者はどの引数で問題が発生したかを正確に特定することができます。

Timは、このマニュアルチェックは.NET Frameworkとそれ以前 for .NET Coreバージョンで完璧に機能すると述べています。 しかし、複数のパラメータを扱う場合は、冗長で繰り返しが多くなります。 バリデーションが必要なパラメータを1つ追加するごとに、3~4行のコードが追加され、メソッド本体が乱雑になります。

C#の簡易アプローチ10 - ArgumentNullException.ThrowIfNull()

この時点で、ティムは最新のC# 10構文を紹介します。 各パラメータに対して複数行を書く代わりに、開発者は1行のヌルチェックを書くことができます:

ArgumentNullException.ThrowIfNull(message);
ArgumentNullException.ThrowIfNull(message);

ティムは、このワンライナーは内部的に同じ検証ロジックを実行すると説明しています。 渡された引数が NULL の場合、メソッドは自動的に例外をスローします。

プログラムが再び実行されると、次の出力が表示されます:

System.ArgumentNullException: Value cannot be null. (Parameter 'message')
System.ArgumentNullException: Value cannot be null. (Parameter 'message')

動作は同じですが、構文が簡略化されています。 コンストラクタを使用して新しい ArgumentNullException オブジェクトを手動でインスタンス化したり、paramName パラメータを手動で指定したりする必要はありません。 呼び出し側のパラメータ名は、コンパイラによって自動的に推測されます。

ティム氏は、この改善によって時間を節約し、間違ったパラメータ名を参照するヒューマンエラーの可能性を減らすことができると強調しています。

例複数のパラメータ

ティムは次に、複数のパラメータを処理する際に、従来の方法と新しい方法を比較します。

C# 10以前では、開発者は次のように書くかもしれません:

if (name is null)
    throw new ArgumentNullException(nameof(name));
if (email is null)
    throw new ArgumentNullException(nameof(email));
if (password is null)
    throw new ArgumentNullException(nameof(password));
if (name is null)
    throw new ArgumentNullException(nameof(name));
if (email is null)
    throw new ArgumentNullException(nameof(email));
if (password is null)
    throw new ArgumentNullException(nameof(password));

C# 10の機能強化により、同じチェックをより簡潔に書くことができるようになりました:

ArgumentNullException.ThrowIfNull(name);
ArgumentNullException.ThrowIfNull(email);
ArgumentNullException.ThrowIfNull(password);
ArgumentNullException.ThrowIfNull(name);
ArgumentNullException.ThrowIfNull(email);
ArgumentNullException.ThrowIfNull(password);

この改善は、単に行数を減らすだけでなく、メソッドをよりすっきりさせ、読みやすくし、保守しやすくします。 Timは、あなたのメソッドが3つのパラメータを期待する場合、12行のコードではなく、3つのヌルチェックだけが必要であると指摘しています。

なぜ重要なのか - より安全で堅牢なコード

ティムは、デモの中で手動で文字列にnullを渡すことは現実的ではないかもしれないが、現実世界の問題を表していると指摘する。 API、ユーザー入力、デシリアライズ処理、またはオブジェクトが返される操作によって、予期せずNULLオブジェクトが生成される可能性があります。

メソッドの開始時にNULLチェックを追加することで、予期しない動作を防ぎ、問題が伝播する前にコールスタックの早い段階で例外をスローします。

また、この新しい構文は、メソッド全体で一貫したエラー処理パターンを維持するのに役立つと述べています。 無効な入力や未定義のオブジェクトに強い、堅牢なコードを書くことを奨励します。

ArgumentNullExceptionの詳細

Timは、ArgumentNullExceptionがSystem名前空間の一部であり、ArgumentExceptionクラスを継承していることを強調しています。 NULL参照が、それを有効な引数として受け付けないメソッドに渡されたときにスローされます。

通常、以下の内容が含まれます:

  • 問題の原因となったパラメータ名

  • 明確なエラーメッセージ:"値をnullにすることはできません。

  • 例外が発生した場所を示すコールスタック。

ティムの例では、.NET 6が構文を改善しながらも、この動作を継続していることを示しています。

また、開発者はこれらのチェックをヌルコーラス演算子(??)やデフォルト値のような他の機能と組み合わせることで、例えばフォールバック・ロジックを提供できることも簡単に説明している:

message ??= "Default message";
message ??= "Default message";

これは、メソッドが必要であれば、スローする代わりにデフォルト値を割り当てることを可能にします。

エラー処理における Null チェックの重要性

Timは、C#がNULL可能な参照型をサポートするようになったとはいえ、実行時のNULLチェックは依然として不可欠であることを開発者に思い出させる。 コンパイラは、ヌル参照に関するすべての問題を検出することはできません。

彼は、引数をチェックし、適切な場合にはArgumentNullExceptionをスローし、入力が有効な場合にのみメソッドが実行されるようにすることが良い習慣であると強調しています。 これにより、ランタイムエラーを最小限に抑え、エラー処理を簡素化し、サイレントエラーを防ぎます。

まとめと今後の展望

ティムは最後に、C# 11ではさらに多くの機能拡張が導入されるが、今のところ、ArgumentNullException.ThrowIfNull()は、.NET 6のエラー処理とコード安全性のための最高の小さな改善点の1つであると述べています。

彼は開発者たちに、自分のプロジェクトでこのアプローチを試してみて、自分たちのメソッドがどれだけきれいに見えるかを確認するよう勧めている。 彼は最後にこう質問する:"C# 10のこの変更についてどう思いますか?

最終的な考え

Tim Corey 氏の video は、ArgumentNullException.ThrowIfNull() メソッドが C# 10 のシンプルかつ強力な改善であることを明らかにしています。エラーが発生しやすい手動コードを減らし、有効な引数を確保し、NULL 引数が渡されたときにプログラムを素早く失敗させることができます。

この方法を一貫して使用することで、開発者は、例外をきれいに処理し、微妙なヌル参照バグを回避する、堅牢で読みやすく保守性の高いコードを構築することができます。

要するに、あなたのメソッドが有効なパラメータを期待し、NULL引数を防ぎたいときはいつでも、Tim Coreyの例に従って、それを使ってください:

ArgumentNullException.ThrowIfNull(parameterName);
ArgumentNullException.ThrowIfNull(parameterName);

これは、.NET 6以降のNULL値やランタイムエラーからコードを保護する、よりクリーンで安全な最新の方法です。

Hero Worlddot related to C# 10と.NET 6で10分以内にNullパラメータをチェックする
Hero Affiliate related to C# 10と.NET 6で10分以内にNullパラメータをチェックする

好きなことを共有することで収入を増やす

.NET、C#、Java、Python、またはNode.jsを使用する開発者向けのコンテンツを作成しますか?あなたの専門知識を副収入に変えましょう!

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね