0Pricing
C# Academy · レッスン

Null条件演算子

?.で安全にアクセスします。

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

null の連鎖が引き起こす問題

null 参照のメンバーにアクセスすると、NullReferenceException がスローされます。これは C# で最もよくある実行時クラッシュの1つです。

user.Address.City のように呼び出しを連鎖させると、連鎖内のどの部分も null になる可能性があります。以前は、if によるチェックを何重にも記述して対処していました。

?. の登場

null 条件演算子 ?. は、式全体の評価を短絡させます。左辺が null の場合、例外をスローする代わりに結果として null を返します。

これは「オブジェクトが null でない場合にだけ、このメンバーにアクセスする」と読むことができます。

string name = null;
int? length = name?.Length;
System.Console.WriteLine(length == null);

結果は null 許容型になる

?. は null を返す可能性があるため、結果の型は null 許容型になります。name?.Length は int ではなく int? です。

そのため、通常の int ではなく int? に格納します。

string text = "hello";
int? len = text?.Length;
System.Console.WriteLine(len);

実行できるサンプル

このプログラムは、オブジェクトが存在する場合には ?. が値を返し、存在しない場合には null を返すことを示します。

実行して、例外が一度もスローされないことを確認してください。

using System;

class Program
{
    static void Main()
    {
        string a = "world";
        string b = null;
        Console.WriteLine(a?.ToUpper());
        Console.WriteLine(b?.ToUpper() ?? "(null)");
    }
}

複数の ?. の連鎖

複数のメンバーにわたって ?. を連鎖させることができます。いずれかの部分が null になると、連鎖全体が停止して null を返します。

そのため、customer や Order が null でも、customer?.Order?.Total は安全です。

string s = null;
int? upperLen = s?.ToUpper()?.Length;
System.Console.WriteLine(upperLen == null);

null 条件インデクサー ?[]

配列やリストには、?[] というインデクサー形式もあります。コレクションが null の場合、インデックスアクセスはクラッシュする代わりに null を返します。

注意:これはコレクションが null であることを防ぐものであり、範囲外のインデックスを防ぐものではありません。

int[] data = null;
int? first = data?[0];
System.Console.WriteLine(first == null);

メソッドを安全に呼び出す

?. はメソッド呼び出しも保護します。list?.Clear() は list が null でない場合にだけ Clear を呼び出し、null の場合は何もしません。

void を返すメソッドでは、null の場合、文全体が単に何もしない処理になります。

System.Collections.Generic.List<int> list = null;
list?.Add(5);
System.Console.WriteLine("No crash");

スレッドセーフなイベントの発生

代表的な用途はイベントの発生です。SomeEvent?.Invoke(this, args) は、少なくとも1つのハンドラーが登録されている場合にだけ、安全にイベントを発生させます。

これにより、チェックと呼び出しの間に競合が発生する可能性がある、以前の null チェックパターンが置き換えられました。

System.Action handler = null;
handler?.Invoke();
System.Console.WriteLine("Invoked safely");

?? との組み合わせ

?. は null 合体演算子 ?? と自然に組み合わせて、連鎖の結果が null の場合に代替値を指定できます。

name?.Length ?? 0 は、name の長さを返し、name が null の場合は 0 を返します。

string name = null;
int length = name?.Length ?? 0;
System.Console.WriteLine(length);

見落としやすい注意点

最後の値型が null 非許容型であっても、?. を使うと式は null 許容になります。list?.Count は int ではなく int? です。

通常の int が必要な場合は、その後に ?? 0 を付けるか、GetValueOrDefault() を使用してください。

var list = new System.Collections.Generic.List<int> { 1, 2 };
int count = list?.Count ?? 0;
System.Console.WriteLine(count);

完全な比較

このプログラムは、冗長な if を使う方法と簡潔な ?. を使う方法を比較します。どちらも例外を防ぎますが、?. のほうがはるかにすっきりしています。

using System;

class Program
{
    static void Main()
    {
        string s = null;
        int len = s != null ? s.Length : -1;
        Console.WriteLine(len);
        Console.WriteLine(s?.Length ?? -1);
    }
}

理解度チェック

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

まとめ

null 条件演算子 ?.(およびインデクサーの ?[])は、オブジェクトが null の場合にメンバーアクセスを停止し、例外をスローする代わりに null を返します。

結果は null 許容型になるため、?? と組み合わせて代替値を指定します。

よくある質問

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

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

「Null条件演算子」で何を学びますか?

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

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

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

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

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

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

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

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

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