0Pricing
C# Academy · レッスン

Null合体演算子

??と??=によるデフォルト値を学びます。

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

代替値の指定

値が存在する場合はその値を使い、null の場合は既定値を使いたいことがよくあります。null 合体演算子 ?? は、まさにこの処理を行います。

a ?? b は、a が null でなければ a を使い、そうでなければ b を使うという意味です。

string input = null;
string name = input ?? "Guest";
System.Console.WriteLine(name);

?? の評価方法

まず左辺が評価されます。左辺が null でなければ、右辺はまったく評価されません。

この短絡評価により、高コストな代替処理は本当に必要な場合にだけ実行されます。

string cached = "data";
string value = cached ?? Compute();
System.Console.WriteLine(value);
// Compute() is never called here

null 許容値型での使用

?? は null 許容値型のラップ解除にも使用できます。int? maybe と ?? 0 を組み合わせると、null 非許容の通常の int になります。

これは、既定値を使って int? から int に変換する簡潔な方法です。

int? maybe = null;
int sure = maybe ?? 0;
System.Console.WriteLine(sure);

実行できる例

このプログラムは、null の可能性がある設定を読み取り、既定値にフォールバックします。実行して、フォールバックが動作する様子を確認してください。

using System;

class Program
{
    static void Main()
    {
        string theme = null;
        string active = theme ?? "light";
        Console.WriteLine("Theme: " + active);
    }
}

?? の連鎖

複数の代替値を連鎖させることができます。式は左から右へ、最初に見つかった null でない値を選びます。

a ?? b ?? c は、まず a、次に b、最後の手段として c の順に試します。

string a = null;
string b = null;
string c = "default";
System.Console.WriteLine(a ?? b ?? c);

??= 演算子

null 合体代入 ??= は、左辺が現在 null の場合にだけ右辺を代入します。

x ??= y は if (x == null) x = y; の短縮形であり、x にすでに値がある場合は変更しません。

string config = null;
config ??= "default";
System.Console.WriteLine(config);
config ??= "ignored";
System.Console.WriteLine(config);

??= による遅延初期化

??= の一般的な用途は遅延初期化です。オブジェクトが初めて必要になったときだけ作成します。

次回以降の呼び出しではフィールドがすでに設定されているため、??= は何もしません。

System.Collections.Generic.List<int> items = null;
items ??= new System.Collections.Generic.List<int>();
items.Add(1);
System.Console.WriteLine(items.Count);

?. と ?? の組み合わせ

?. と ?? の組み合わせは非常によく使われます。?. が例外を防ぎ、連鎖の結果が null の場合は ?? が値を指定します。

user?.Name ?? "Unknown" は名前を安全に読み取り、null の場合は "Unknown" を既定値にします。

string s = null;
int length = s?.Length ?? -1;
System.Console.WriteLine(length);

完全なプログラムでの ??

ここでは ?. と ?? を組み合わせて、安全な長さを出力します。null の文字列を使って実行し、フォールバックを確認してください。

using System;

class Program
{
    static void Main()
    {
        string username = null;
        string display = username ?? "anonymous";
        Console.WriteLine(display);
        Console.WriteLine(username?.Length ?? 0);
    }
}

null の場合に ?? でスローする

?? の右辺には、throw を含め、任意の式を指定できます。これにより、?? を予期しない null に対して即座に失敗する簡潔な方法として使えます。

name ?? throw new ArgumentNullException(nameof(name)) は名前を返し、null の場合は例外をスローします。

string Validate(string name) =>
    name ?? throw new System.ArgumentNullException(nameof(name));

右結合の動作

?? は右結合なので、a ?? b ?? c は a ?? (b ?? c) としてグループ化されます。

実際には「最初の null でない値が選ばれる」という意味ですが、複雑な式を考えるときにはこの点を知っておくとよいでしょう。

int? a = null;
int? b = null;
int result = a ?? b ?? 99;
System.Console.WriteLine(result);

理解度チェック

null 合体演算子についての理解度を確認しましょう。

まとめ

?? は左辺が null でなければ左辺を、そうでなければ右辺を返し、連鎖させることもできます。??= は対象が null の場合にだけ代入するため、遅延初期化に適しています。

?. と組み合わせて安全で簡潔な null 処理を行ったり、?? throw を使って即座に失敗させたりすることもできます。

よくある質問

「Null合体演算子」レッスンは無料ですか?

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

「Null合体演算子」で何を学びますか?

??と??=によるデフォルト値を学びます。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「Null合体演算子」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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