Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C# 13 / .NET 9 の新機能 (RC 1 時点)
Search
neno
September 28, 2024
Technology
1
2.2k
C# 13 / .NET 9 の新機能 (RC 1 時点)
.NET ラボ 2024/09/28 での発表資料
neno
September 28, 2024
Tweet
Share
More Decks by neno
See All by neno
分解して理解する Aspire
nenonaninu
1
140
Unsafe.BitCast のすゝめ。
nenonaninu
0
230
.NET 9 のパフォーマンス改善
nenonaninu
0
2.5k
Re:ゼロから始める Observability
nenonaninu
3
910
Node-AI のリッチな WEB フロントエンドを支える技術
nenonaninu
3
1.5k
C# ではじめる OpenTelemetry
nenonaninu
0
4.7k
.NET 8 で既定で有効になった Dynamic PGO について
nenonaninu
3
8.2k
明日から使える ASP.NET Core ロギング術!
nenonaninu
1
10k
C# の async/await は実際にどうやって動いているか
nenonaninu
10
27k
Other Decks in Technology
See All in Technology
クラウドサービス事業者におけるOSS
tagomoris
1
810
エンジニアの育成を支える爆速フィードバック文化
sansantech
PRO
3
1.1k
全文検索+セマンティックランカー+LLMの自然文検索サ−ビスで得られた知見
segavvy
2
110
ホワイトボードチャレンジ 説明&実行資料
ichimichi
0
130
偶然 × 行動で人生の可能性を広げよう / Serendipity × Action: Discover Your Possibilities
ar_tama
1
1.1k
Data-centric AI入門第6章:Data-centric AIの実践例
x_ttyszk
1
410
OpenID Connect for Identity Assurance の概要と翻訳版のご紹介 / 20250219-BizDay17-OIDC4IDA-Intro
oidfj
0
280
バックエンドエンジニアのためのフロントエンド入門 #devsumiC
panda_program
18
7.5k
PHPで印刷所に入稿できる名札データを作る / Generating Print-Ready Name Tag Data with PHP
tomzoh
0
110
飲食店予約台帳を支えるインタラクティブ UI 設計と実装
siropaca
7
1.8k
関東Kaggler会LT: 人狼コンペとLLM量子化について
nejumi
3
590
Platform Engineeringは自由のめまい
nwiizo
4
2.1k
Featured
See All Featured
The Pragmatic Product Professional
lauravandoore
32
6.4k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
9
440
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
133
33k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.3k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Adopting Sorbet at Scale
ufuk
74
9.2k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.4k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
960
Testing 201, or: Great Expectations
jmmastey
42
7.2k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Automating Front-end Workflow
addyosmani
1368
200k
Transcript
C# 13 / .NET 9 の新機能 (RC 1 時点) .NET
ラボ 2024/09/28 何縫ねの。
自己紹介 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
OSS 紹介 2 属性を付与するだけ Tapper • C# の型定義から TypeScript の型定義を生成する
.NET Tool/ library • JSON / MessagePack 対応! https://github.com/nenoNaninu/Tapper
OSS 紹介 3 • C# の SignalR Client を強く型付けするための Source
Generator TypedSignalR.Client Before After (using TypedSignalR.Client) こんな SignalR の Hub と Receiver の interface が あったとして… 脱文字列! 全てが強く型付け! https://github.com/nenoNaninu/TypedSignalR.Client
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 紹介
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 紹介
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
お品書き 7 • C# 13 の新機能 • .NET 9 の新しい
BCL
C# 13 の新機能 8
C# 13 の新機能 9 Partial Properties
C# 13 の新機能 10 Partial Properties の前に…
C# 13 の新機能 11 Partial Properties の前に…
C# 13 の新機能 12 Partial Properties
C# 13 の新機能 13 Partial Properties Partial Properties では 自動実装
Property が使えない
C# 13 の新機能 14 Partial Properties Partial Properties では 自動実装
Property が使えない 基本的には Source Generator 用
C# 13 の新機能 15 Params Collection • 配列以外でも params が利用できるように
C# 13 の新機能 16 Params Collection • 配列以外でも params が利用できるように
params Span<T> params ReadOnlySpan<T> で受け取れば配列分の アロケーションが かからない
C# 13 の新機能 17 Params Collection • 自前の型でも利用可能 • Collection
expression (C# 12) に対応していれば params collection でも使える
C# 13 の新機能 18 Params Collection • 自前の型でも利用可能 • Collection
expression (C# 12) に対応していれば params collection でも使える 自前の型でやる場合は CollectionBuilderAttributeで ビルダーメソッドを 指定すれば OK
C# 13 の新機能 19 lock / System.Threading.Lock
C# 13 の新機能 20 lock / System.Threading.Lock Lock の方が早い .NET
9 からは Lock を使おう
C# 13 の新機能 21 lock / System.Threading.Lock 展開のされ方が異なる (Lock が特殊対応)
C# 13 の新機能 22 allows ref struct • Generics で
ref struct が 渡せるように
C# 13 の新機能 23 allows ref struct • Generics で
ref struct が 渡せるように
C# 13 の新機能 24 OverloadResolutionPriority • オーバーロード解決の 優先順位を弄れる
C# 13 の新機能 25 OverloadResolutionPriority • オーバーロード解決の 優先順位を弄れる OverloadResolutionPriority が無かったら
int[] の方が呼ばれる
.NET 9 の新しい BCL 26
.NET 9 の新しい BCL 27 [GeneratedRegex] がプロパティでも利用可能に
• 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()
.NET 9 の新しい BCL 29 LINQ : CountBy
.NET 9 の新しい BCL 30 LINQ : AggregateBy
.NET 9 の新しい BCL 31 LINQ : Index
.NET 9 の新しい BCL 32 JsonSerializerOptions.IndentSize
.NET 9 の新しい BCL 33 JsonSchemaExporter
.NET 9 の新しい BCL 34 Base64Url
.NET 9 の新しい BCL 35 Debug.Assert • 新しい API の追加というよりは、属性による挙動の変化
.NET 9 の新しい BCL 36 Debug.Assert [OverloadResolutionPriority(-1)] • 新しい API
の追加というよりは、属性による挙動の変化
.NET 9 の新しい BCL 37 Debug.Assert [OverloadResolutionPriority(-1)] [CallerArgumentExpression] • 新しい
API の追加というよりは、属性による挙動の変化
.NET 9 の新しい BCL 38 Debug.Assert .NET 8 .NET 9
.NET 9 の新しい BCL 39 Debug.Assert .NET 8 Release build
時は dll から 文字列ごと消えるので安心 .NET 9
.NET 9 の新しい BCL 40 Debug.Assert Release Build Debug Build
.NET 9 の新しい BCL 41 Debug.Assert Release Build Debug Build
Release build 時は UserString Heap から 文字列が消えている
.NET 9 の新しい BCL 42 Debug.Assert Release Build [Conditional(“DEBUG”)] が付与されているから
Debug Build Release build 時は UserString Heap から 文字列が消えている
.NET 9 の新しい BCL 43 Interlocked.CompareExchange を enum に対して使えるように .NET
8 .NET 9
.NET 9 の新しい BCL 44 Interlocked.CompareExchange を enum に対して使えるように .NET
8 .NET 9 where T: class が外れた
.NET 9 の新しい BCL 45 System.Net.ServerSentEvents • プロトコル的には物凄い今更感ある API の追加
• LLM 系のレスポンスが SSE 使ってるからその需要に応えた形 • RC 1 時点では nuget パッケージにはあるけど組み込まれてない。 実際には ArrayPool 等を 使うべき
.NET 9 の新しい BCL 46 SpanSplitEnumerator を返す MemoryExtensions.Split<T>() の追加
.NET 9 の新しい BCL 47 素朴に string を split するより高速(zero
allocation) SpanSplitEnumerator を返す MemoryExtensions.Split<T>() の追加
.NET 9 の新しい BCL 48 SpanSplitEnumerator を返す MemoryExtensions.Split<T>() の追加 素朴に
string を split するより高速(zero allocation) この例では ToString() してしまっているから あまり意味がないけど…
.NET 9 の新しい BCL 49 SpanSplitEnumerator を返す MemoryExtensions.Split<T>() の追加 素朴に
string を split するより高速(zero allocation) この例では ToString() してしまっているから あまり意味がないけど… .NET 8 で追加された Split より使いやすい
.NET 9 の新しい BCL 50 AlternateLookup
.NET 9 の新しい BCL 51 AlternateLookup いや ROS<char> じゃなくて UTF-8
の ROS<byte> で引きたいだが…
.NET 9 の新しい BCL 52 AlternateLookup いや ROS<char> じゃなくて UTF-8
の ROS<byte> で引きたいだが… neuecc 先生がすでに ブログ書いているのでそちら参照の事 https://neue.cc/2024/08/29_AlternateLookup.html
.NET 9 の新しい BCL 53 Task.WhenEach
おわり