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