この記事は、C# Advent Calendar 2025 8日目の記事です。
C# 14 の新機能の中でも、かなり限定的ですが 日常コードに確実に効く変更をひとつだけ深掘りしてみました。
※この記事で紹介する機能(Null-conditional assignment)は C# 14 の機能です。試すには .NET 10 SDK(または Visual Studio 2026)が必要です。
はじめに
C# でコードを書いていると、こんな処理を何度も書いたことがあると思います。
if (customer != null)
{
customer.Order = GetCurrentOrder();
}
やっていることは単純で、「null でなければ代入する」 だけです。
C# には ?.(null 条件演算子)が長らく存在していましたが、これは 「参照する」ためのもので、代入には使えません でした。
そのため、null なら何もしない代入 を書こうとすると、結局 if に戻る!
これは C# 13 までほぼ唯一の選択肢でした。
C# 14 で何が変わったのか
C# 14 では、null 条件演算子 ?. を 代入の左辺に書ける ようになりました。
customer?.Order = GetCurrentOrder();
このコードの挙動は次のとおりです。
-
customerがnullの場合
→ 何もしない -
customerがnullでない場合
→Orderに値が代入される - 右辺の
GetCurrentOrder()は
左辺が null でない場合にのみ評価される
つまり、「null なら何もしない代入」 を 制御構文ではなく 式として 書けるようになりました。
Before / After で見る違い
C# 13 まで(Before)
if (customer != null)
{
customer.Order = GetCurrentOrder();
}
- 安全
- 意図は明確
- ただし制御構文が前面に出る
C# 14(After)
customer?.Order = GetCurrentOrder();
- 意図が「条件付き代入」そのもの
- 1 行で完結
- UI コードやドメインコードがすっきりする
【参考】三項演算子で書こうとするとどうなるか
「if を使わずに書けないか」と考えた結果、三項演算子を使ったコードを見かけることもありました。
customer = customer != null
? UpdateOrder(customer)
: customer;
動作としては間違っていませんが、
- 「代入したい」だけなのに処理が遠回りになる
- 元のオブジェクトを返すためのメソッドが必要になる
- 意図(null なら何もしない)がコードから読み取りにくい
といった理由から、実用的とは言いづらい書き方でした。
C# 14 の Null-conditional assignment は、こうした 「無理に式で書こうとした苦肉の策」 を自然な形で置き換えられる点にも意味があります。
右辺が評価されない、という重要な性質
この機能で特に重要なのは、右辺が常に評価されるわけではない という点です。
customer?.Order = CreateOrder();
-
customer == null
→CreateOrder()は 呼ばれない -
customer != null
→ 初めて呼ばれる
副作用のある処理(ログ、DB、API 呼び出しなど)でも if と同じ感覚で 安全に書けます 。
複合代入も使える
単純な代入だけでなく、複合代入演算子 も使用できます。
counter?.Value += 1;
order?.TotalPrice *= rate;
ただし、以下は使えません。
// コンパイルエラー
customer?.Count++;
customer?.Count--;
++ / -- は「読み取り+書き込み」を同時に行う構文のため、この仕様ではサポートされていません。
どんな場面で効くか
この機能が特に効くのは、次のようなコードです。
- WinForms / WPF / MAUI などの UI コード
- nullable な参照を扱うドメインコード
- Optional な依存を持つオブジェクト操作
viewModel?.Status = Status.Loaded;
logger?.Log(message);
context?.CurrentUser = user;
「null なら無視したい」 という意図がそのままコードに表れます。
if が不要になったわけではない
この変更は、if を否定するものではありません。
-
elseが必要な場合 - null 時に別処理をしたい場合
- 条件が複雑な場合
こういったケースでは、従来どおり if の方が適切です。
C# 14 は 「書けなかったものが書けるようになった」 だけで、既存の書き方を置き換えるものではありません。
公式仕様・参考リンク
-
What’s new in C# 14(Microsoft Learn)
https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-14 -
Null-conditional operators(既存仕様の背景理解)
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/member-access-operators#null-conditional-operators--and-
※ 本記事の内容は、上記公式ドキュメントの
Null-conditional assignment に基づいています。
まとめ
- C# 13 までは 「null なら何もしない代入」 を安全に書くには
ifが必要だった - 三項演算子での回避も可能だったが、可読性・実用性に難があった
- C# 14 では
?.を代入の左辺に使えるようになった - 右辺は必要なときだけ評価される
- 地味だが、毎日書くコードに確実に効く改善
派手な新機能ではありませんが、コードの「儀式」が一つ減る 、そんな変更だと思います。