Slide 1

Slide 1 text

C# 13 / .NET 9 の新機能 (RC 1 時点) .NET ラボ 2024/09/28 何縫ねの。

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

お品書き 7 • C# 13 の新機能 • .NET 9 の新しい BCL

Slide 9

Slide 9 text

C# 13 の新機能 8

Slide 10

Slide 10 text

C# 13 の新機能 9 Partial Properties

Slide 11

Slide 11 text

C# 13 の新機能 10 Partial Properties の前に…

Slide 12

Slide 12 text

C# 13 の新機能 11 Partial Properties の前に…

Slide 13

Slide 13 text

C# 13 の新機能 12 Partial Properties

Slide 14

Slide 14 text

C# 13 の新機能 13 Partial Properties Partial Properties では 自動実装 Property が使えない

Slide 15

Slide 15 text

C# 13 の新機能 14 Partial Properties Partial Properties では 自動実装 Property が使えない 基本的には Source Generator 用

Slide 16

Slide 16 text

C# 13 の新機能 15 Params Collection • 配列以外でも params が利用できるように

Slide 17

Slide 17 text

C# 13 の新機能 16 Params Collection • 配列以外でも params が利用できるように params Span params ReadOnlySpan で受け取れば配列分の アロケーションが かからない

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

C# 13 の新機能 18 Params Collection • 自前の型でも利用可能 • Collection expression (C# 12) に対応していれば params collection でも使える 自前の型でやる場合は CollectionBuilderAttributeで ビルダーメソッドを 指定すれば OK

Slide 20

Slide 20 text

C# 13 の新機能 19 lock / System.Threading.Lock

Slide 21

Slide 21 text

C# 13 の新機能 20 lock / System.Threading.Lock Lock の方が早い .NET 9 からは Lock を使おう

Slide 22

Slide 22 text

C# 13 の新機能 21 lock / System.Threading.Lock 展開のされ方が異なる (Lock が特殊対応)

Slide 23

Slide 23 text

C# 13 の新機能 22 allows ref struct • Generics で ref struct が 渡せるように

Slide 24

Slide 24 text

C# 13 の新機能 23 allows ref struct • Generics で ref struct が 渡せるように

Slide 25

Slide 25 text

C# 13 の新機能 24 OverloadResolutionPriority • オーバーロード解決の 優先順位を弄れる

Slide 26

Slide 26 text

C# 13 の新機能 25 OverloadResolutionPriority • オーバーロード解決の 優先順位を弄れる OverloadResolutionPriority が無かったら int[] の方が呼ばれる

Slide 27

Slide 27 text

.NET 9 の新しい BCL 26

Slide 28

Slide 28 text

.NET 9 の新しい BCL 27 [GeneratedRegex] がプロパティでも利用可能に

Slide 29

Slide 29 text

• 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()

Slide 30

Slide 30 text

.NET 9 の新しい BCL 29 LINQ : CountBy

Slide 31

Slide 31 text

.NET 9 の新しい BCL 30 LINQ : AggregateBy

Slide 32

Slide 32 text

.NET 9 の新しい BCL 31 LINQ : Index

Slide 33

Slide 33 text

.NET 9 の新しい BCL 32 JsonSerializerOptions.IndentSize

Slide 34

Slide 34 text

.NET 9 の新しい BCL 33 JsonSchemaExporter

Slide 35

Slide 35 text

.NET 9 の新しい BCL 34 Base64Url

Slide 36

Slide 36 text

.NET 9 の新しい BCL 35 Debug.Assert • 新しい API の追加というよりは、属性による挙動の変化

Slide 37

Slide 37 text

.NET 9 の新しい BCL 36 Debug.Assert [OverloadResolutionPriority(-1)] • 新しい API の追加というよりは、属性による挙動の変化

Slide 38

Slide 38 text

.NET 9 の新しい BCL 37 Debug.Assert [OverloadResolutionPriority(-1)] [CallerArgumentExpression] • 新しい API の追加というよりは、属性による挙動の変化

Slide 39

Slide 39 text

.NET 9 の新しい BCL 38 Debug.Assert .NET 8 .NET 9

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

.NET 9 の新しい BCL 40 Debug.Assert Release Build Debug Build

Slide 42

Slide 42 text

.NET 9 の新しい BCL 41 Debug.Assert Release Build Debug Build Release build 時は UserString Heap から 文字列が消えている

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

.NET 9 の新しい BCL 43 Interlocked.CompareExchange を enum に対して使えるように .NET 8 .NET 9

Slide 45

Slide 45 text

.NET 9 の新しい BCL 44 Interlocked.CompareExchange を enum に対して使えるように .NET 8 .NET 9 where T: class が外れた

Slide 46

Slide 46 text

.NET 9 の新しい BCL 45 System.Net.ServerSentEvents • プロトコル的には物凄い今更感ある API の追加 • LLM 系のレスポンスが SSE 使ってるからその需要に応えた形 • RC 1 時点では nuget パッケージにはあるけど組み込まれてない。 実際には ArrayPool 等を 使うべき

Slide 47

Slide 47 text

.NET 9 の新しい BCL 46 SpanSplitEnumerator を返す MemoryExtensions.Split() の追加

Slide 48

Slide 48 text

.NET 9 の新しい BCL 47 素朴に string を split するより高速(zero allocation) SpanSplitEnumerator を返す MemoryExtensions.Split() の追加

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

.NET 9 の新しい BCL 50 AlternateLookup

Slide 52

Slide 52 text

.NET 9 の新しい BCL 51 AlternateLookup いや ROS じゃなくて UTF-8 の ROS で引きたいだが…

Slide 53

Slide 53 text

.NET 9 の新しい BCL 52 AlternateLookup いや ROS じゃなくて UTF-8 の ROS で引きたいだが… neuecc 先生がすでに ブログ書いているのでそちら参照の事 https://neue.cc/2024/08/29_AlternateLookup.html

Slide 54

Slide 54 text

.NET 9 の新しい BCL 53 Task.WhenEach

Slide 55

Slide 55 text

おわり