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

C# 13 / .NET 9 の新機能 (RC 1 時点)

neno
September 28, 2024

C# 13 / .NET 9 の新機能 (RC 1 時点)

.NET ラボ 2024/09/28 での発表資料

neno

September 28, 2024
Tweet

More Decks by neno

Other Decks in Technology

Transcript

  1. C# 13 / .NET 9 の新機能 (RC 1 時点) .NET

    ラボ 2024/09/28 何縫ねの。
  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# 13 の新機能 14 Partial Properties Partial Properties では 自動実装

    Property が使えない 基本的には Source Generator 用
  9. C# 13 の新機能 16 Params Collection • 配列以外でも params が利用できるように

    params Span<T> params ReadOnlySpan<T> で受け取れば配列分の アロケーションが かからない
  10. C# 13 の新機能 17 Params Collection • 自前の型でも利用可能 • Collection

    expression (C# 12) に対応していれば params collection でも使える
  11. C# 13 の新機能 18 Params Collection • 自前の型でも利用可能 • Collection

    expression (C# 12) に対応していれば params collection でも使える 自前の型でやる場合は CollectionBuilderAttributeで ビルダーメソッドを 指定すれば OK
  12. • Guid.NewGuid() • UUID v4 • ランダム • version 4bit,

    variant 2bit, 残り 122bit がランダム • Guid.CreateVersion7() • UUID v7 • 時間でソート可能 • Unix time 48bit (先頭), version 4bit, variant 2bit, 残り 74bit がランダム .NET 9 の新しい BCL 28 Guid.CreateVersion7()
  13. .NET 9 の新しい BCL 36 Debug.Assert [OverloadResolutionPriority(-1)] • 新しい API

    の追加というよりは、属性による挙動の変化
  14. .NET 9 の新しい BCL 39 Debug.Assert .NET 8 Release build

    時は dll から 文字列ごと消えるので安心 .NET 9
  15. .NET 9 の新しい BCL 41 Debug.Assert Release Build Debug Build

    Release build 時は UserString Heap から 文字列が消えている
  16. .NET 9 の新しい BCL 42 Debug.Assert Release Build [Conditional(“DEBUG”)] が付与されているから

    Debug Build Release build 時は UserString Heap から 文字列が消えている
  17. .NET 9 の新しい BCL 45 System.Net.ServerSentEvents • プロトコル的には物凄い今更感ある API の追加

    • LLM 系のレスポンスが SSE 使ってるからその需要に応えた形 • RC 1 時点では nuget パッケージにはあるけど組み込まれてない。 実際には ArrayPool 等を 使うべき
  18. .NET 9 の新しい BCL 47 素朴に string を split するより高速(zero

    allocation) SpanSplitEnumerator を返す MemoryExtensions.Split<T>() の追加
  19. .NET 9 の新しい BCL 48 SpanSplitEnumerator を返す MemoryExtensions.Split<T>() の追加 素朴に

    string を split するより高速(zero allocation) この例では ToString() してしまっているから あまり意味がないけど…
  20. .NET 9 の新しい BCL 49 SpanSplitEnumerator を返す MemoryExtensions.Split<T>() の追加 素朴に

    string を split するより高速(zero allocation) この例では ToString() してしまっているから あまり意味がないけど… .NET 8 で追加された Split より使いやすい
  21. .NET 9 の新しい BCL 52 AlternateLookup いや ROS<char> じゃなくて UTF-8

    の ROS<byte> で引きたいだが… neuecc 先生がすでに ブログ書いているのでそちら参照の事 https://neue.cc/2024/08/29_AlternateLookup.html