個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Microsoft MVP for Developer Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

C# 10 の新機能

はじめに

C# 10 の新機能の特長は、「簡潔なコードを書くための機能」が多く追加されていることです。
 
本記事では、C# 10 の新機能のうち便利なものをいくつかピックアップしました。新しい機能を利用することでお作法的なコードを排除でき、簡潔で直感的なコードを記述できるのでぜひ確認してみてください。

C# 10 の新機能の全てをご確認したい場合については以下の公式情報をご参照ください。
docs.microsoft.com
 
.NET 6 の新機能の情報は以下をご覧ください。
hiro128.hatenablog.jp
 

レコード構造体

レコード構造体については以下の記事を参照ください。
hiro128.hatenablog.jp
 

global using

global using については以下の記事を参照ください。
hiro128.hatenablog.jp
 

暗黙的な using ディレクティブ

暗黙的な using ディレクティブについては以下の記事を参照ください。
hiro128.hatenablog.jp
 

ファイルスコープの名前空間宣言

ファイルスコープの名前空間宣言については以下の記事を参照ください。
hiro128.hatenablog.jp
  

ラムダ式の自然型

ラムダ式の自然型については以下の記事を参照ください。
hiro128.hatenablog.jp
 

const および文字列補間

const および文字列補間については以下の記事を参照ください。
hiro128.hatenablog.jp
 

拡張プロパティパターン

拡張プロパティパターンについては以下の記事を参照ください。
hiro128.hatenablog.jp

 
  

ASP.NET Core Update(.NET 6)の整理(随時更新中)

.NET 6 の RC 2 がリリースされました。ASP.NET Core についても Preview 1 から RC 2 まで段階的に情報や新機能がリリースされており、情報が分散して探しにくいので重要な更新情報を整理してみました。
  
公式情報も更新されているため、内容は随時更新中です。
 
.NET 6 の更新情報は以下をご覧ください。
hiro128.hatenablog.jp
 
 

 
 

Minimal API の導入(.NET 6 Preview 4)

公式情報:
Introducing minimal APIs
関連記事:
hiro128.hatenablog.jp
 

Minimal API のアップデート(.NET 6 RC 2)

Minimal API に対し、以下のいくつかのアップデートがあります。
公式情報:Minimal API updates
 

パラメータのバインディングの対応強化(.NET 6 RC 2)

  • TryParseBindAsync に継承されたメソッドに対するサポートを追加
  • パブリックの TryParseBindAsync メソッドが正しい形式かどうかをチェックする機能が追加
  • これらのメソッドに間違った構文を使っている場合エラーがスローされるようになった
  • カスタムタイプにルート、ヘッダ属性、およびクエリ文字列から値をバインドしたい場合、カスタムタイプに静的な TryParse メソッドを追加することができる

公式情報:Parameter Binding
 

OpenAPI の対応強化(.NET 6 RC 2)

  • Accepts() 拡張メソッドや [Consumes(typeof(Todo), "application/json", IsRequired = false)] 属性を使って、リクエストボディが必須かどうかを記述できる
  • Accepts 拡張メソッドとConsumes 属性で、生成された open-api docs に対して、Todo タイプと application/json の両方を表現することができる。

公式情報:OpenAPI
 

ソースコードの分析(.NET 6 RC 2)
  • ルートハンドラの問題を素早く発見したり、ミドルウェアの設定ミスを警告したりするためのアナライザを追加
  • アナライザは、WebApplicationBuilder のミドルウェアの順序を検証し、誤ったミドルウェアの構成や順序が検出された場合に警告する
  • IActionResult を実装した型がルートハンドラから返された場合に検出し、結果が意図せずに JSON としてシリアル化された場合に警告する機能を追加

公式情報:Source Code Analysis
 

APIの名前変更(破壊的変更)(.NET 6 RC 2)

  • 意図を適切に説明するために以下のAPIの名称を変更した。
    • DelegateEndpointConventionBuilder -> RouteHandlerBuilder
    • OpenApiDelegateEndpointConventionBuilderExtensions -> OpenApiRouteHandlerBuilderExtensions
    • DelegateEndpointRouteBuilderExtensions は、既存のEndpointRouteBuilderExtensions と統合した。

(上記の変更により、DelegateEndpointRouteHandlerに置き換え、クラス名のConventionを削除した)

公式情報:Breaking Changes (APIs Renames)
 

非同期ストリーミング(.NET 6 Preview 4)

  • コントローラのアクションからレスポンスのJSONフォーマッタに至るまで、非同期ストリーミングがサポートされるようになった
  • アクションからIAsyncEnumerableを返しても、レスポンスの内容が送信される前にメモリにバッファリングされなくなった
  • 非同期に列挙できる大規模なデータセットを返す際のメモリ使用量が削減される

公式情報:Async streaming
 

HTTP logging ミドルウェア(.NET 6 Preview 4)

  • HTTPリクエストとHTTPレスポンスの情報(ヘッダーとボディ全体を含む)を記録する、新しい組み込みミドルウェア
  • HTTP logging は以下のログを提供する
    • HTTP リクエスト情報
    • 共通のプロパティ
    • ヘッダー
    • ボディ
    • HTTP レスポンス情報

公式情報:HTTP logging middleware
 

.NET MAUI Update の整理(随時更新中)

.NET MAUI の Preview 14 がリリースされました。Preview 1 から Preview 14 まで段階的に情報や新機能がリリースされており、情報が分散して探しにくいので重要な更新情報を整理してみました。
  
公式情報も更新されているため、内容は随時更新中です。
 
.NET 6 の新機能の情報は以下をご覧ください。
hiro128.hatenablog.jp
 
 

.NET MAUI、 Xamarn.Forms からの改良ポイント

.NET MAUI、 Xamarn.Forms からの改良ポイントの記事はこちらです。
hiro128.hatenablog.jp
 

.NET MAUI Preview 14 の更新情報

.NET MAUI Preview 14 の更新情報はこちらです。
hiro128.hatenablog.jp
 

.NET MAUI Preview 13 の更新情報

.NET MAUI Preview 13 の更新情報はこちらです。
hiro128.hatenablog.jp
 

.NET MAUI Preview 12 の更新情報

.NET MAUI Preview 12 の更新情報はこちらです。
hiro128.hatenablog.jp
 

.NET MAUI Preview 11 の更新情報

.NET MAUI Preview 11 の更新情報はこちらです。
hiro128.hatenablog.jp
 

.NET MAUI Preview 10 の更新情報

.NET MAUI Preview 10 の更新情報はこちらです。
hiro128.hatenablog.jp
 

.NET MAUI Preview 9 の更新情報

.NET MAUI Preview 9 の更新情報はこちらです。
hiro128.hatenablog.jp
 

.NET MAUI Preview 8 の更新情報

.NET MAUI Preview 8 の更新情報はこちらです。
hiro128.hatenablog.jp 
 

.NET MAUI Preview 7 の更新情報

.NET MAUI Preview 7 の更新情報はこちらです。
hiro128.hatenablog.jp

 
以下、随時更新中です。
 
 

.NET 6 の Scatter/Gather IO の効果を Visual Studio for Mac 2022 Preview 1 on M1 Mac で試してみましたが、まだ、闇が深かったです(訂正済)

2021/10/05 22:40 検証方法に間違いがあったため(VS for Mac がデバッグありの実行になっていました)、再度検証し直し記事も訂正しております。ご指摘ありがとうございました。
 
 

はじめに

.NET 6 では FileStream がほぼ完全に書き直されており、速度と信頼性のが高まりました。また、複数のバッファーに対応した(Scatter / Gather IO)新しい API が導入されています。Scatter / Gather IO を使用すると、単一の sys-call で複数のバッファーを渡すことにより、高コストの sys-call の数を減らすことができます。
 
devblogs.microsoft.com
 
 

Visual Studio for Mac 2022 Preview 1 on M1 Mac で試したら...

WindowsLinux でのベンチマーク結果は公式ブログにデータがありましたので、Mac ではどのような結果になるか試してみました。
 
公式ブログの記事内のコードから、サンプルプロジェクトを作成しました。
github.com
 
ベンチマークのライブラリは、BenchmarkDotNet を利用しているようなので、同じように構成しました。
github.com
 
Visual Studio for Mac 2022 Preview 1 で実行した結果ですが...

// * Summary *

BenchmarkDotNet=v0.13.1, OS=macOS Big Sur 11.6 (20G165) [Darwin 20.6.0]
Apple M1 2.40GHz, 1 CPU, 8 logical and 8 physical cores
.NET SDK=6.0.100-rc.1.21463.6
  [Host]     : .NET 6.0.0 (6.0.21.45113), X64 RyuJIT
  DefaultJob : .NET 6.0.0 (6.0.21.45113), X64 RyuJIT


|      Method |     Mean |    Error |   StdDev |
|------------ |----------|----------|----------|
|       Write | 47.92 ms | 1.109 ms | 3.271 ms |
| WriteGather | 48.51 ms | 1.567 ms | 4.621 ms |

 
なんと上記の通り、WriteGather()の方が遅いという結果となりました...
 
 

ベクトル化 IO がうまく機能していない

詳細を解析していないのでなんとも言えないですが、公式ブログでは、Linux ではベクトル化 IO が機能しているとのことでしたが、Mac ではなんらかの理由でうまくベクトル化 IO が機能していない感じです。

一応、.NET 6 と Darwin のソースを調べてみましたが、pwritev() はサポートしているようですが、ベクトル化 IO がうまく機能していない詳細な原因まではわかりませんでした。
 
...と、いったんは思ったのですが、よく見ると、ベンチマーク結果が、X64 となっているので、Rosetta 2 による変換が入っているのが気になります。

ちなみに、意識せず x64 版がインストールされていたのは、dotnet-maui-check でインストールしたからでした。
 
 

Arm64 版 SDK をインストールして再度チャレンジ

というわけで、.NET 6 RC1 SDK をいったん全て削除して、再度 Arm64 版 SDK をインストールして Visual Studio for Mac 2022 Preview 1 で再度試したところ、今度は、無事成功しました。しかも、WriteGather()の方が速く、ベクトル化 IO も効果を発揮しています。

// * Summary *

BenchmarkDotNet=v0.13.1, OS=macOS Big Sur 11.6 (20G165) [Darwin 20.6.0]
Apple M1, 1 CPU, 8 logical and 8 physical cores
.NET SDK=6.0.100-rc.1.21463.6
  [Host]     : .NET 6.0.0 (6.0.21.45113), Arm64 RyuJIT
  DefaultJob : .NET 6.0.0 (6.0.21.45113), Arm64 RyuJIT


|      Method |     Mean |    Error |   StdDev |
|------------ |----------|----------|----------|
|       Write | 45.11 ms | 0.950 ms | 2.772 ms |
| WriteGather | 40.23 ms | 1.304 ms | 3.844 ms |

 
 

今回得た知見

今回の検証で以下のような知見を得ました。

  • M1 Mac で .NET 6 の、Scatter/Gather IO は Arm64 版 でしか有効にならない。x64 版では効果がない。
  • M1 Mac で .NET 6 SDK の、x64, Arm64 を両方インストールした場合、同じ場所に配置され、後にインストールした方が有効となる。side by side にはならない。
  • M1 Mac で .NET 6 SDK の、x64, Arm64 を切り替えたい場合、念のため SDK をいったん削除してから再インストールした方が無難そう。
  • M1 Mac で Visual Studio for Mac 2022 Preview 1 では Arm64 版 SDK でのデバッグ実行がまだ正常動作しない。x64 版 SDK/Rosetta 2 ならデバッグ実行できる。

 
というわけで、Visual Studio for Mac 2022 の今後のリリースに期待します。
 
 
.NET 6 の更新情報は以下をご覧ください。
hiro128.hatenablog.jp

Visual Studio 2022 for Mac Preview 1 がリリースされましたので状況を確認してみました。

.NET 6 の GA まであと1ヶ月ちょっとのタイミングでようやく、Visual Studio 2022 for Mac Preview 1 がリリースされました。
devblogs.microsoft.com
 

UI が ネイティブの macOS UI で書き直されました。

これが Visual Studio 2022 for Mac の一番大きなトピックです。この件に工数がかかってしまい、他の件は手がまわりきらなかった感があります。見た目の違いは下記の通りです。色味が若干変わっており、視認性が良くなっています。
 
Xamarin の創設者 @migueldeicaza によると、Gtk+ から AppKit に書き直され C# / Xamarin.Mac で開発されているようです。


 

Visual Studio 2022 Visual Studio 2019
f:id:hiro128:20211003155331p:plain f:id:hiro128:20211003155724p:plain

 
その他、クラッシュの軽減とレスポンスが改善しているとのことです。

  • クラッシュの軽減については、長時間使用していないので体感できませんでした。
  • レスポンスの改善については、MacBook Air (M1, 2020) 上で大きな差ではないですが確かにもたつかなくなったという感覚はあります。

 
 

Windows 版に準じた Git の UI が適用されました

自分は、Git の操作はコマンドで行っているので、実際の画面を見てみてもよくわかりませんでしたが、Git のUI が Windows 版に近づいたそうです。確かにコードの変更箇所は見やすくなりました。
 
 

.NET 6 と C#10 への対応

例えば、Visual Studio 2019 for Mac では、.NET 6 RC1 を導入してもエラーが出てしまっていた以下の Minimal API のサンプルが動作するようになりました。
github.com
 

Visual Studio 2022 Visual Studio 2019
f:id:hiro128:20211003163745p:plain f:id:hiro128:20211003163809p:plain

 
 

SDK スタイルの Xamarin プロジェクトはまだ利用できません

下記のように、公式ブログに記載がある通り、SDK スタイルの iOS, Android プロジェクトはサポートされていません。.
 

Visual Studio for Mac continues to support web and cloud development with .NET Core 3.1 and later, mobile dev with Xamarin Traditional projects, and game development using Unity.

 
.NET 6 GA まであと1ヶ月強という状況と後述する MAUI の GA の情報から予想するに .NET 6 GA のタイミングでは、.NET 6 の iOS, Android のワークロードはサポートされず、これまでの非 SDK スタイルの従来の Xamarin.iOS, Xamarin.Android プロジェクトのサポートに留まる可能性が高そうですが、なんとかリリースされることを期待したい思いです。
 
なお、試しに既存の非 SDK スタイルの Xamarin.iOS プロジェクトを開いて、編集、デバッグしてみましたが、問題なく利用できました。
 
したがって、net6.0-android, net6.0-ios といった TFM が利用できるのも、もう少し先になりそうです。
 
 

.NET MAUI の GA は 2022 Q2 に延期されました。

2020年5月の公式ブログでは、以下のように

  • 2020年 Q4 から 2021年 Q3 までプレビュー
  • RC 2021年9月
  • GA 2021年11月

という予定でしたが 2022 Q2 延期になったようです。
devblogs.microsoft.com
 
 

まとめ

Preview 1 の状況をまとめると以下のような状況です。(実際に動作確認した結果です)

ワークロード 対応状況
コンソールアプリ
ASP.NET
Xamarin.iOS
Xamarin.Android
.NET 6 iOS
.NET 6 Android
.NET 6 Mac Catalyst
MAUI

 
まだ Preview 1 ですのでこれから新たな機能がリリースされると思います。次のプレビューを期待して待ちます。