Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C# 14 / .NET 10 の新機能 (RC 1 時点)

Avatar for neno neno
September 27, 2025

C# 14 / .NET 10 の新機能 (RC 1 時点)

.NET ラボ 2025/09/27 での発表資料

Avatar for neno

neno

September 27, 2025
Tweet

More Decks by neno

Other Decks in Technology

Transcript

  1. C# 14 / .NET 10 の新機能 (RC 1 時点) .NET

    ラボ 2025/09/27 何縫ねの。
  2. 自己紹介 1 • 所属: NTTドコモビジネス株式会社 イノベーションセンター • Microsoft MVP for

    Developer Technologies (2024~) • .NET / Web Development • 趣味: C#, OSS, ドール, 一眼(α7 IV), シーシャ • 執心領域 • C# ⇔ TypeScript • SignalR • Observability / OpenTelemetry 何縫ねの。 nenoNaninu nenoMake ブログ https://blog.neno.dev その他 https://neno.dev
  3. OSS 紹介 2 属性を付与するだけ Tapper • C# の型定義から TypeScript の型定義を生成する

    .NET Tool/ library • JSON / MessagePack 対応! https://github.com/nenoNaninu/Tapper
  4. OSS 紹介 3 • C# の SignalR Client を強く型付けするための Source

    Generator TypedSignalR.Client Before After (using TypedSignalR.Client) こんな SignalR の Hub と Receiver の interface が あったとして… 脱文字列! 全てが強く型付け! https://github.com/nenoNaninu/TypedSignalR.Client
  5. 4 • TypeScript の SignalR Client を強く型付けするための .NET Tool /

    library TypedSignalR.Client.TypeScript Before After (using TypedSignalR.Client.TypeScript) 脱文字列! 全てが強く型付け! TypeScript 用の型を C# から自動生成 MessagePack Hub Protocol 対応! https://github.com/nenoNaninu/TypedSignalR.Client.TypeScript 属性を付与するだけ! OSS 紹介
  6. 5 • SignalR 使ったアプリを快適に開発するための GUI を自動生成する library • 2 step

    で利用可能! • http pipeline に middleware の追加 • Hub と Receiver を定義してる interface に属性を付与 • JWT 認証 サポート • パラメータのユーザ定義型サポート • JSON で入力! SignalR 版 SwaggerUI TypedSignalR.Client.DevTools https://github.com/nenoNaninu/TypedSignalR.Client.DevTools OSS 紹介
  7. AspNetCore.SignalR.OpenTelemetry OSS 紹介 6 https://github.com/nenoNaninu/AspNetCore.SignalR.OpenTelemetry • トレースのための計装 • 最低限のログ •

    接続時 • Transport 層の情報も出力(WebSocket 等) • メソッド呼び出し時 • HubName.MethodName の素朴なログ • メソッド呼び出し毎にログのスコープを追加 • HubName, MethodName, InvocationId を 振っているのでログの検索性が向上 • Duration • 切断時 • 切断時に例外が発生していれば例外もログに出力 Inspired by HttpLogging SignalR のメソッド呼び出し毎に スパンが切られるように https://github.com/nenoNaninu/AspNetCore.SignalR.OpenTelemetry
  8. C# 14 の新機能 12 field keyword の追加 • ついにプロパティの中で field

    keyword が使えるように 今まで private field を別途用意せざるを 得なかったものが不要に
  9. C# 14 の新機能 13 field keyword の追加 • get/set accessor

    のどちらか片方のみで使う事も可能
  10. C# 14 の新機能 14 First-class Span Types • C# 7.2

    で Span / ReadOnlySpan が導入された • 広く使われている • 特にパフォーマンスが重要な場合は必須 • C# 13 まで Span / ReadOnlySpan は BCL に存在する型でしかなかった • C# 14 から Span / ReadOnlySpan は C# が特別扱いする型 (first-class) に
  11. C# 14 の新機能 15 First-class Span Types: 暗黙的型変換 • ①

    T[] → Span<T> • T1 が T2 に対して covariance-convertible である場合 (共変変換可能) • ② T1[] → ROS<T2> • ③ Span<T1> → ROS<T2> • ④ ROS<T1> → ROS<T2> • ⑤ string → ROS<char> 厳密には extension の receiver に 暗黙的に変換される仕様も追加されている
  12. C# 14 の新機能 16 First-class Span Types: 暗黙的型変換 • ちなみに。C#

    13 でも T1[] → IEnumerable<T2> は問題なかった • 何故なら C# の配列は IList<T>, IReadOnlyList<T> が実装されているため C# 13 までは適切に intellisense を提示したい場合 大量のオバーロードを用意する必要があった C# 14 からは ROS 用だけ用意しておけば大体 OK
  13. C# 14 の新機能 17 First-class Span Types: オーバーロード解決時における Span /

    ReadOnlySpan の優先 • 優先順位的には ReadOnlySpan > Span > IEnumerable
  14. C# 14 の新機能 18 nameof が unbound generic type をサポート

    • C# 13 まで nameof は bound generic type のみサポート • C# 14 から nameof は unbound generic type もサポート
  15. C# 14 の新機能 19 ラムダ式においてパラメータ修飾子を用いる際の記述の簡略化 • C# 13 までは ref,

    ref readonly, scoped, out, in など パラメータ修飾子が用いられている場合、型を省略できなかった • C# 14 からは型を省略できるように
  16. C# 14 の新機能 22 複合代入演算子のオーバーロード • +=, -=, *=, /=,

    %=, &=, |=, ^=, <<=, >>=, >>>= をオーバーロード可能に • 今まで + オペレータをオーバーロードした場合 += も使えたが (y += xは y = x + y と展開された) パフォーマンスの観点から 複合代入演算子も直接オーバーロード可能に
  17. .NET 10 の新しい BCL 29 LINQ: InfiniteSequence • こちらも Sequence

    同様 INumber<T> が実装されていればなんでもOK
  18. .NET 10 の新しい BCL 30 Async LINQ: IAsyncEnumerable に対する LINQ

    実装 • 今まで IAsyncEnumerable で LINQ 使いたい場合は dotnet/reactive 配下にあった System.Linq.Async パッケージを nuget からとってくる必要があった • .NET 10 からはめでたく BCL 入り • パッケージ依存無しで Async LINQ を利用可能に!
  19. .NET 10 の新しい BCL 31 MemoryExtensions の各種拡張メソッドに IEqualityComparer 受け取るオーバーロードが追加 •

    Contains, ContainsAny, ContainsAnyExcept, SequenceCompareTo, IndexOf, IndexOfAny, IndexOfAnyExcept, LastIndexOf, LastIndexOfAnyExcept, StartsWith, EndsWith, Count, Replace IEqualityComparer を渡せる!
  20. .NET 10 の新しい BCL 33 System.Runtime.CompilerServices に InlineArray2~InlineArray16 が追加 •

    実質的には collection expression が内部的に使うもの .NET 9 時点では上記は以下のように展開される 将来的にはこの手の コンパイラ生成の struct が減って アセンブリサイズが減る…ハズ? .NET 10 で追加
  21. .NET 10 の新しい BCL 34 System.Threading に Volatile.ReadBarrier/WriteBarrier が追加 そもそも

    ReadBarrier / WriteBarrier とは何ぞ? というのは以下の記事で。 【C#】マルチスレッド関連操作の詳説。 https://blog.neno.dev/entry/2021/12/23/124215
  22. .NET 10 の新しい BCL 35 System.Net.ServerSentEvents が BCL 入り •

    .NET 9 時点では BCL 入りせず package としてのみ提供されていた • https://speakerdeck.com/nenonaninu/net-9-noxin-ji-neng-rc-1-shi-dian?slide=46 • .NET 10 でついに BCL 入り。
  23. .NET 10 の新しい BCL 36 System.Net.ServerSentEvents が BCL 入り •

    ASP.NET Core も .NET 10 から SSE をサポート • https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore- 10.0?view=aspnetcore-10.0#support-for-server-sent-events-sse • AI 需要ですねぇ…
  24. .NET 10 の新しい BCL 39 HttpMethod.Query の追加 • なおまだ Query

    method は標準化されていない • https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-safe-method-w-body-11
  25. .NET 10 の新しい BCL 47 ActivitySource / Meter に Schema

    URL を設定できるように • OpenTelemetry 側にトレース・メトリクスの attribute にスキーマを 指定可能な仕様があり、それに合わせた形。 • https://github.com/open-telemetry/opentelemetry-specification/tree/v1.49.0/specification/schemas Activity については以下の記事で。 【C#】ASP.NET Core と W3C Trace Context とお手軽ロギング。 https://blog.neno.dev/entry/2023/07/04/181843
  26. .NET 10 の新しい BCL 48 FrozenDictionary.Create ImmutableDictionary.CreateRangeWithOverwrite • Span からダイレクトに

    FrozenDictionary / ImmutableDictionary を 作成可能な API • 実質的には dictionary expressions のための API 追加 IEqualityComparer を渡す
  27. .NET 10 の新しい BCL 51 File based apps • 1

    つの C# ファイルをスクリプトの如く実行できる • csproj 不要! https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/tutorials/file-based-programs 従来の csproj に対する dotnet run 等と同じく コマンドライン引数渡すのに 「--」が必要
  28. .NET 10 の新しい BCL 54 slnx 爆誕!さらば sln! • 全く人間に優しくなかった

    sln だが、ついに新形式 slnx が登場 • slnx は大変人間に優しい • csproj が SDK スタイルになったのと同じで革命的に便利 • GA のアナウンスがまだ • しかし .NET 10 RC1 から slnx がデフォルトになった • .NET 10 の GA と同時に slnx も GA か…? sln (旧形式) slnx (新形式) ConsoleApp が 1 つだけ含まれている sln/slnx の比較 https://devblogs.microsoft.com/dotnet/introducing-slnx-support-dotnet-cli/ https://learn.microsoft.com/ja-jp/dotnet/core/compatibility/sdk/10.0/dotnet-new-sln-slnx-default
  29. References 56 • https://github.com/dotnet/core • https://github.com/dotnet/roslyn • https://github.com/dotnet/runtime • https://github.com/dotnet/csharplang

    • https://devblogs.microsoft.com/dotnet/introducing-slnx-support-dotnet-cli/ • https://learn.microsoft.com/en-us/aspnet/core/release-notes/aspnetcore-10.0 • https://learn.microsoft.com/ja-jp/dotnet/core/compatibility/sdk/10.0/dotnet-new- sln-slnx-default • https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-safe-method-w-body-11