12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C# 14 で「null なら何もしない代入」が書けるようになった

Posted at

この記事は、C# Advent Calendar 2025 8日目の記事です。

C# 14 の新機能の中でも、かなり限定的ですが 日常コードに確実に効く変更をひとつだけ深掘りしてみました。

※この記事で紹介する機能(Null-conditional assignment)は C# 14 の機能です。試すには .NET 10 SDK(または Visual Studio 2026)が必要です。

はじめに

C# でコードを書いていると、こんな処理を何度も書いたことがあると思います。

C#
if (customer != null)
{
    customer.Order = GetCurrentOrder();
}

やっていることは単純で、「null でなければ代入する」 だけです。

C# には ?.(null 条件演算子)が長らく存在していましたが、これは 「参照する」ためのもので、代入には使えません でした。

そのため、null なら何もしない代入 を書こうとすると、結局 if に戻る!

これは C# 13 までほぼ唯一の選択肢でした。

C# 14 で何が変わったのか

C# 14 では、null 条件演算子 ?.代入の左辺に書ける ようになりました。

C#
customer?.Order = GetCurrentOrder();

このコードの挙動は次のとおりです。

  • customernull の場合
    何もしない
  • customernull でない場合
    Order に値が代入される
  • 右辺の GetCurrentOrder()
    左辺が null でない場合にのみ評価される

つまり、「null なら何もしない代入」 を 制御構文ではなく 式として 書けるようになりました。

Before / After で見る違い

C# 13 まで(Before)

C#
if (customer != null)
{
    customer.Order = GetCurrentOrder();
}
  • 安全
  • 意図は明確
  • ただし制御構文が前面に出る

C# 14(After)

customer?.Order = GetCurrentOrder();
  • 意図が「条件付き代入」そのもの
  • 1 行で完結
  • UI コードやドメインコードがすっきりする

【参考】三項演算子で書こうとするとどうなるか

if を使わずに書けないか」と考えた結果、三項演算子を使ったコードを見かけることもありました。

C#
customer = customer != null
    ? UpdateOrder(customer)
    : customer;

動作としては間違っていませんが、

  • 「代入したい」だけなのに処理が遠回りになる
  • 元のオブジェクトを返すためのメソッドが必要になる
  • 意図(null なら何もしない)がコードから読み取りにくい

といった理由から、実用的とは言いづらい書き方でした。

C# 14 の Null-conditional assignment は、こうした 「無理に式で書こうとした苦肉の策」 を自然な形で置き換えられる点にも意味があります。

右辺が評価されない、という重要な性質

この機能で特に重要なのは、右辺が常に評価されるわけではない という点です。

C#
customer?.Order = CreateOrder();
  • customer == null
    CreateOrder()呼ばれない
  • customer != null
    → 初めて呼ばれる

副作用のある処理(ログ、DB、API 呼び出しなど)でも if と同じ感覚で 安全に書けます

複合代入も使える

単純な代入だけでなく、複合代入演算子 も使用できます。

C#
counter?.Value += 1;
order?.TotalPrice *= rate;

ただし、以下は使えません。

C#
// コンパイルエラー
customer?.Count++;
customer?.Count--;

++ / -- は「読み取り+書き込み」を同時に行う構文のため、この仕様ではサポートされていません。

どんな場面で効くか

この機能が特に効くのは、次のようなコードです。

  • WinForms / WPF / MAUI などの UI コード
  • nullable な参照を扱うドメインコード
  • Optional な依存を持つオブジェクト操作
C#
viewModel?.Status = Status.Loaded;
logger?.Log(message);
context?.CurrentUser = user;

「null なら無視したい」 という意図がそのままコードに表れます。

if が不要になったわけではない

この変更は、if を否定するものではありません。

  • else が必要な場合
  • null 時に別処理をしたい場合
  • 条件が複雑な場合

こういったケースでは、従来どおり if の方が適切です。

C# 14 は 「書けなかったものが書けるようになった」 だけで、既存の書き方を置き換えるものではありません。

公式仕様・参考リンク

※ 本記事の内容は、上記公式ドキュメントの
Null-conditional assignment に基づいています。

まとめ

  • C# 13 までは 「null なら何もしない代入」 を安全に書くには if が必要だった
  • 三項演算子での回避も可能だったが、可読性・実用性に難があった
  • C# 14 では ?. を代入の左辺に使えるようになった
  • 右辺は必要なときだけ評価される
  • 地味だが、毎日書くコードに確実に効く改善

派手な新機能ではありませんが、コードの「儀式」が一つ減る 、そんな変更だと思います。

12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?