7
2

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 の Extension members を超簡潔に解説

Posted at

女性エンジニア応援 Advent Calendar 2025 参加者募集中です!

はじめに

C# 14(.NET 10 世代)から新たに導入された Extension members は、従来の拡張メソッドを“上位互換”にしたような機能です。

拡張メソッドは便利でしたが、「これプロパティで書けたら自然なのに…」というケースが多かったはず。Extension members は、まさにその“違和感”を解決するための仕様です。

C# 14 の新機能は公式ドキュメントでも紹介されています。1

この機能が 何を変えるのか/どんな場面で活きるのか/どう書くのか を超簡潔にまとめました。

C# 14 の Extension members は、.NET 10 Preview 3(2025年4月)でプレビューとして導入され、その後 .NET 10 / C# 14 の正式リリース(2025年11月11日)で本番利用できる言語機能になりました。23

1. Extension members で何が変わる?

まずは従来との違いを比較してみます。

従来 (.NET 3.5〜) C# 14 以降
拡張できるもの メソッドのみ
static string TrimEx(this string s)…
拡張メンバー
- メソッド
- プロパティ
- インデクサ
- static メンバー

従来は 必ずメソッド にせざるを得なかったため、
本来はプロパティで表現したいものまで、こう書いていました。

C#
EnumerableExtensions.IsEmpty(list)

C# 14 では、これが次のように書けます。

C#
list.IsEmpty

これだけでも API の“自然さ”が段違い。

2. 文法:extension ブロックでまとめて宣言する

Extension members は extension (receiver) { ... } ブロック内に宣言します。

C#
public static class EnumerableExtensions
{
    // ① インスタンス拡張
    extension<T>(IEnumerable<T> source)
    {
        public bool IsEmpty => !source.Any();
        public T this[int index] => source.Skip(index).First();
    }

    // ② static 拡張
    extension<T>(IEnumerable<T>)
    {
        public static IEnumerable<T> Identity => Enumerable.Empty<T>();

        public static IEnumerable<T> Combine(IEnumerable<T> a, IEnumerable<T> b)
            => a.Concat(b);
    }
}

呼び出し例

C#
if (nums.IsEmpty) { ... }             // ① インスタンス拡張
var all = IEnumerable<int>.Identity;  // ② static 拡張

本家クラスのメンバーと見分けがつかないほど自然に扱えるのが特徴です。

3. どんな場面で活躍するの?(従来の拡張メソッドとの比較)

Extension members の恩恵が大きいのは、
まさに、「拡張メソッドの不自然さに限界を感じていた場面」 です。

✔ 3-1. 状態チェックを“プロパティで書きたい”時

【従来】

C#
if (EnumerableExtensions.IsEmpty(list)) ...

【Extension members】

C#
if (list.IsEmpty) ...

自然さが段違い。
LINQ/DDD/業務ロジックでも圧倒的に読みやすい。

✔ 3-2. 外部ライブラリの“惜しい” API を改善したい時

【従来】

C#
RetryHelper.Retry(func, times);

【Extension members】

C#
func.Retry(times)

外部ライブラリに後付けで“綺麗な DSL”を与えられる。

✔ 3-3. DDD で ValueObject に語彙を“自然に”追加したい時

【従来】

ドメイン型を直接触れないと、ロジックが中途半端に散らばる。

【Extension members】

C#
price.WithTax
price.IsFree
userId.IsTemporary

既存型を壊さずドメイン語彙を増やせる。
DDD / Clean Architecture の現場では特に強い。

✔ 3-4. レガシー巨大コードベースを“静かに改善”したい時

【従来】

  • 拡張メソッドが乱立しやすい
  • API の距離が不自然
  • メンテナンスが煩雑

【Extension members】

  • “元クラスのメンバー”として自然に追加できる
  • 呼び出す側のコードも自然になる

安全に改善でき、後方互換も保つ。

✔ 3-5. コレクション操作の便利 API を自然に追加したい時

【従来】

Utility 関数や ExtensionMethod が散らばりがちだった。

【Extension members】

C#
list.IsSingle
dict.TryGet(key)
list.NearestToZero

LINQ スタイルの自然な API を後付けできる。

4. 既存コードとの互換性

  • this パラメータ式の従来拡張メソッドは そのまま使える
  • 旧式 + 新方式の混在も可能
  • 既存ライブラリを段階的に移行可能

後方互換性はしっかり確保されています!!

5. 制限・注意点(Preview 6 時点)

項目 内容
対応メンバー メソッド / プロパティ / インデクサ(イベントは検討中)
ジェネリック制約 レシーバーの型引数は先頭に置く必要あり
static クラス拡張 File, Path などのstatic 型そのものの拡張は未対応

※正式版で広がる可能性があります。

6. 実際に触る手順(VS2026 Preview / VS2022 でも可)

.NET 10 SDK をインストール
■ プロジェクトにこれを追加

<LangVersion>preview</LangVersion>

■ 上ののサンプルを貼り付けてビルド

※ VS2026 Preview / VS2022 どちらでも、
「C# 14 を有効にできる .NET 10 SDK を使っているか」 が要点です。

まとめ

Extension members は、拡張メソッドが抱えていた“不自然さ”を解消し、API 設計の表現力を大きく押し上げる機能です。

  • プロパティやインデクサを自然に追加できる
  • DSL(業務ロジック)の質が上がる
  • レガシープロジェクトを壊さず改善できる
  • ValueObject に語彙を与えるのが超簡単

C# 14 の中でも特に「開発体験に直結する進化」といって良い機能だと思います。

C#関連のおすすめ記事

【Visual Studio 2026】MCPがついに標準化!NuGet MCPを有効化して動作確認してみた
【C#】ボタン重複実行はなぜ起きる? - Windowsメッセージキューの仕組みと対策
【C#】PLC通信の基本を言葉の定義から理解する - 入門から実践まで
【保存版】C#基礎100本ノック GitHub Codespacesで学ぶC#
レガシーC#コード対比集(昔こう→今こう)

  1. Microsoft Docs「What's new in C# 14」
    https://learn.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-14

  2. InfoQ「.NET 10 Preview 3: C# 14 Extension Members, ASP.NET Core State Persistence and Other Improvements」
    In C# 14, notable improvements have been made to extension members. These members now support static methods, instance properties, and static properties.
    https://www.infoq.com/news/2025/04/dotnet-10-preview3/

  3. Cristian Sifuentes「New Features in .NET 10 & C# 14 — The Expert’s Playbook (2025)」
    .NET 10 (LTS) and C# 14 dropped today — November 11, 2025.
    https://dev.to/cristiansifuentes/new-features-in-net-10-c-14-the-experts-playbook-2025-2pe5

7
2
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
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?