Slide 1

Slide 1 text

C# 14 / .NET 10 の新機能 (RC 1 時点) .NET ラボ 2025/09/27 何縫ねの。

Slide 2

Slide 2 text

自己紹介 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

Slide 3

Slide 3 text

OSS 紹介 2 属性を付与するだけ Tapper • C# の型定義から TypeScript の型定義を生成する .NET Tool/ library • JSON / MessagePack 対応! https://github.com/nenoNaninu/Tapper

Slide 4

Slide 4 text

OSS 紹介 3 • C# の SignalR Client を強く型付けするための Source Generator TypedSignalR.Client Before After (using TypedSignalR.Client) こんな SignalR の Hub と Receiver の interface が あったとして… 脱文字列! 全てが強く型付け! https://github.com/nenoNaninu/TypedSignalR.Client

Slide 5

Slide 5 text

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 紹介

Slide 6

Slide 6 text

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 紹介

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

OSS 紹介 7 https://github.com/nenoNaninu/AspireExtensions • Aspire の便利な hosting integration • gRPC UI • Minio AspireExtensions

Slide 9

Slide 9 text

お品書き 8 • C# 14 の新機能 • .NET 10 の新しい BCL • .NET 10 の新機能

Slide 10

Slide 10 text

• 以降 ROS は ReadOnlySpan を意味します 注意書き 9

Slide 11

Slide 11 text

C# 14 の新機能 10

Slide 12

Slide 12 text

C# 14 の新機能 11 Extension members

Slide 13

Slide 13 text

C# 14 の新機能 12 field keyword の追加 • ついにプロパティの中で field keyword が使えるように 今まで private field を別途用意せざるを 得なかったものが不要に

Slide 14

Slide 14 text

C# 14 の新機能 13 field keyword の追加 • get/set accessor のどちらか片方のみで使う事も可能

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

C# 14 の新機能 16 First-class Span Types: 暗黙的型変換 • ちなみに。C# 13 でも T1[] → IEnumerable は問題なかった • 何故なら C# の配列は IList, IReadOnlyList が実装されているため C# 13 までは適切に intellisense を提示したい場合 大量のオバーロードを用意する必要があった C# 14 からは ROS 用だけ用意しておけば大体 OK

Slide 18

Slide 18 text

C# 14 の新機能 17 First-class Span Types: オーバーロード解決時における Span / ReadOnlySpan の優先 • 優先順位的には ReadOnlySpan > Span > IEnumerable

Slide 19

Slide 19 text

C# 14 の新機能 18 nameof が unbound generic type をサポート • C# 13 まで nameof は bound generic type のみサポート • C# 14 から nameof は unbound generic type もサポート

Slide 20

Slide 20 text

C# 14 の新機能 19 ラムダ式においてパラメータ修飾子を用いる際の記述の簡略化 • C# 13 までは ref, ref readonly, scoped, out, in など パラメータ修飾子が用いられている場合、型を省略できなかった • C# 14 からは型を省略できるように

Slide 21

Slide 21 text

C# 14 の新機能 20 Partial events

Slide 22

Slide 22 text

C# 14 の新機能 21 Null-conditional assignment

Slide 23

Slide 23 text

C# 14 の新機能 22 複合代入演算子のオーバーロード • +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>= をオーバーロード可能に • 今まで + オペレータをオーバーロードした場合 += も使えたが (y += xは y = x + y と展開された) パフォーマンスの観点から 複合代入演算子も直接オーバーロード可能に

Slide 24

Slide 24 text

.NET 10 の新しい BCL 23

Slide 25

Slide 25 text

.NET 10 の新しい BCL 24 Guid.Parse/TryParse が ROS 対応

Slide 26

Slide 26 text

.NET 10 の新しい BCL 25 Console.Write/WriteLine が ROS 対応

Slide 27

Slide 27 text

.NET 10 の新しい BCL 26 LINQ: LeftJoin / RightJoin

Slide 28

Slide 28 text

.NET 10 の新しい BCL 27 LINQ: Shuffle

Slide 29

Slide 29 text

.NET 10 の新しい BCL 28 LINQ: Sequence • INumber が実装されていればなんでもイケる • ちなみに Enumerable.Range は int 限定

Slide 30

Slide 30 text

.NET 10 の新しい BCL 29 LINQ: InfiniteSequence • こちらも Sequence 同様 INumber が実装されていればなんでもOK

Slide 31

Slide 31 text

.NET 10 の新しい BCL 30 Async LINQ: IAsyncEnumerable に対する LINQ 実装 • 今まで IAsyncEnumerable で LINQ 使いたい場合は dotnet/reactive 配下にあった System.Linq.Async パッケージを nuget からとってくる必要があった • .NET 10 からはめでたく BCL 入り • パッケージ依存無しで Async LINQ を利用可能に!

Slide 32

Slide 32 text

.NET 10 の新しい BCL 31 MemoryExtensions の各種拡張メソッドに IEqualityComparer 受け取るオーバーロードが追加 • Contains, ContainsAny, ContainsAnyExcept, SequenceCompareTo, IndexOf, IndexOfAny, IndexOfAnyExcept, LastIndexOf, LastIndexOfAnyExcept, StartsWith, EndsWith, Count, Replace IEqualityComparer を渡せる!

Slide 33

Slide 33 text

.NET 10 の新しい BCL 32 MemoryExtensions に CountAny/ReplaceAny/ReplaceAnyExcept が追加

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

.NET 10 の新しい BCL 34 System.Threading に Volatile.ReadBarrier/WriteBarrier が追加 そもそも ReadBarrier / WriteBarrier とは何ぞ? というのは以下の記事で。 【C#】マルチスレッド関連操作の詳説。 https://blog.neno.dev/entry/2021/12/23/124215

Slide 36

Slide 36 text

.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 入り。

Slide 37

Slide 37 text

.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 需要ですねぇ…

Slide 38

Slide 38 text

.NET 10 の新しい BCL 37 WebSocketStream.Create • WebSocket のメッセージの単位を気にせず ただ単に垂れ流す場合は WebSocketStream.Create がお手軽

Slide 39

Slide 39 text

.NET 10 の新しい BCL 38 WebSocketStream.CreateReadableMessageStream WebSocketStream.CreateWritableMessageStream • WebSocket のメッセージ毎に stream を確保するスタイル

Slide 40

Slide 40 text

.NET 10 の新しい BCL 39 HttpMethod.Query の追加 • なおまだ Query method は標準化されていない • https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-safe-method-w-body-11

Slide 41

Slide 41 text

.NET 10 の新しい BCL 40 Numeric Ordering for String Comparison

Slide 42

Slide 42 text

.NET 10 の新しい BCL 41 TimeSpan.FromMilliseconds のちょっとしたオーバーロードの追加

Slide 43

Slide 43 text

.NET 10 の新しい BCL 42 OrderedDictionary.TryAdd / TryGetValue のオーバーロード追加 • Index が取れるように

Slide 44

Slide 44 text

.NET 10 の新しい BCL 43 System.Text.Json: プロパティの重複の禁止

Slide 45

Slide 45 text

.NET 10 の新しい BCL 44 System.Text.Json: JsonSerializerOptions.Strict の追加

Slide 46

Slide 46 text

.NET 10 の新しい BCL 45 JsonMarshal.GetRawUtf8PropertyName

Slide 47

Slide 47 text

.NET 10 の新しい BCL 46 JsonSerializer.DeserializeAsync に PipeReader を受け取るオーバーロード追加

Slide 48

Slide 48 text

.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

Slide 49

Slide 49 text

.NET 10 の新しい BCL 48 FrozenDictionary.Create ImmutableDictionary.CreateRangeWithOverwrite • Span からダイレクトに FrozenDictionary / ImmutableDictionary を 作成可能な API • 実質的には dictionary expressions のための API 追加 IEqualityComparer を渡す

Slide 50

Slide 50 text

.NET 10 の新しい BCL 49 Convert.FromHexString / TryToHexString の ROS 対応

Slide 51

Slide 51 text

.NET 10 の新機能 50

Slide 52

Slide 52 text

.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 等と同じく コマンドライン引数渡すのに 「--」が必要

Slide 53

Slide 53 text

.NET 10 の新しい BCL 52 File based apps https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/tutorials/file-based-programs shebang が有効な環境なら

Slide 54

Slide 54 text

.NET 10 の新しい BCL 53 File based apps https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/tutorials/file-based-programs パッケージの参照も可能

Slide 55

Slide 55 text

.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

Slide 56

Slide 56 text

おわり

Slide 57

Slide 57 text

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