0Pricing
C# Academy · レッスン

nullに備える

検証と安全なパターンを学びます。

「nullに備える」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

null を防ぐ理由

予期しない null を受け取ったメソッドは、後になってコールスタックの深い場所で、原因が分かりにくい NullReferenceException を発生させることがあります。

ガードとは、最初に引数を確認して明確に失敗させることです。これにより、エラーが本当の原因を直接示すようになります。

従来の null チェック

最も簡単なガードは、必須の引数が null の場合に ArgumentNullException をスローする明示的なチェックです。

これにより、処理を開始する前にメソッドの境界で入力を検証できます。

void Save(string path)
{
    if (path == null)
        throw new System.ArgumentNullException(nameof(path));
    System.Console.WriteLine(path);
}

nameof を使う

ハードコードした文字列ではなく、nameof(path) を渡してください。例外に正確なパラメーター名が表示され、パラメーター名を変更した場合も正しいままになります。

例外をログに記録したときのデバッグが、はるかに簡単になります。

void Greet(string user)
{
    if (user is null)
        throw new System.ArgumentNullException(nameof(user));
    System.Console.WriteLine("Hi " + user);
}

ThrowIfNull ヘルパー

最新の C# では ArgumentNullException.ThrowIfNull(arg) が使用できます。null をチェックし、正しいパラメーター名を自動的に付けて例外をスローします。

簡潔であり、現在の .NET コードで推奨されるガードの書き方です。

void Process(object data)
{
    System.ArgumentNullException.ThrowIfNull(data);
    System.Console.WriteLine("Processing");
}

実行できるガード

このプログラムは、ガードによって null の引数を捕捉し、後でクラッシュさせる代わりに、問題を明確に報告する方法を示します。

実行して、問題のあるパラメーター名を含む例外メッセージを確認してください。

using System;

class Program
{
    static void Print(string text)
    {
        ArgumentNullException.ThrowIfNull(text);
        Console.WriteLine(text);
    }

    static void Main()
    {
        try { Print(null); }
        catch (ArgumentNullException ex) { Console.WriteLine(ex.ParamName); }
    }
}

?? throw によるガード

?? と throw を使うと、代入とガードを組み合わせることができます。これにより、1行で検証と格納を行えます。

フィールドに値を代入するコンストラクターでよく使われるパターンです。

class Service
{
    private readonly string _name;
    public Service(string name)
        => _name = name ?? throw new System.ArgumentNullException(nameof(name));
}

空文字列と null の違い

文字列では、null と空文字列は異なる問題です。string.IsNullOrEmpty または string.IsNullOrWhiteSpace を使うと、両方を一度に検出できます。

空ではあるものの null ではない値には、ArgumentNullException ではなく ArgumentException が適しています。

void SetName(string name)
{
    if (string.IsNullOrWhiteSpace(name))
        throw new System.ArgumentException("Name required", nameof(name));
}

パターンによるガード

is null と is not null のパターンは分かりやすく、オーバーロードされた等値演算子に影響されません。

型が == をオーバーライドしている可能性がある場合は、== null より is null を優先してください。

object value = null;
if (value is null)
    System.Console.WriteLine("It is null");
if (value is not null)
    System.Console.WriteLine("Has value");

スローではなく既定値を使う

すべての null がエラーとは限りません。例外をスローするより、適切な既定値を使うほうがよい場合もあります。

null が許容される場合は ?? を使い、その値が本当に必要な場合にだけ例外をスローしてください。

string BuildPath(string folder)
{
    folder ??= "/tmp";
    return folder + "/file.txt";
}

null 許容参照型の効果

null 許容参照型を有効にすると、null の可能性がある値を逆参照しようとしたときにコンパイラーが警告し、実行前にバグを検出できます。

string(null 非許容)と string?(null 許容)を宣言することで意図を文書化し、アナライザーの解析にも役立ちます。

#nullable enable
string required = "ok";
string? optional = null;
System.Console.WriteLine(optional?.Length ?? 0);

ガードしてから安全に使う

メソッドの先頭でガードを行えば、その後の本体では null チェックを繰り返さずに値を使用できます。

このプログラムは引数をガードしてから、確実にその引数を使用します。

using System;

class Program
{
    static int Length(string s)
    {
        ArgumentNullException.ThrowIfNull(s);
        return s.Length;
    }

    static void Main()
    {
        Console.WriteLine(Length("hello"));
    }
}

理解度チェック

null に対するガードについての理解度を確認しましょう。

まとめ

必須の引数はメソッドの開始時にガードしてください。明確なエラーにするには、ArgumentNullException.ThrowIfNull または nameof と組み合わせた ?? throw を使用します。

空文字列には string.IsNullOrWhiteSpace を使い、安全なチェックには is null パターンを使います。失敗させる代わりに既定値を使える場合は ?? を使用してください。

よくある質問

「nullに備える」レッスンは無料ですか?

はい。「nullに備える」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「nullに備える」で何を学びますか?

検証と安全なパターンを学びます。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「nullに備える」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Nullable値型
  2. Null条件演算子
  3. Null合体演算子
  4. nullに備える
← C# Academyに戻る