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 herenull 許容値型での使用
?? は 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Nullable値型
- Null条件演算子
- Null合体演算子
- nullに備える