2021-10-08: .NETのクラスライブラリ設計 改訂新版, Umbraco 9, Visual Studio 2022 for Mac Preview 1

Published on Friday, 08 October 2021

.NETのクラスライブラリ設計 改訂新版 (Amazon) が10/7に発売されました。

この本は .NET Framework を開発した中で出てきたクラスライブラリーを作る上でのノウハウをまとめたベストプラクティス集のようなものです。

クラスライブラリーを設計するうえでどういった部分に気を付ければよいのか、何をすべきで何をすべきではないのかといったものが書かれているのですが、この本の特徴的な部分は .NET 開発チームの声が注釈としてたくさん入っていることです。そこには .NET でなぜその選択をしたのかといった理由をはじめ、時には後悔なども書かれており、それを読むだけでも楽しめます。

前の翻訳版は .NET 開発者の中では知る人ぞ知るといった本だったのですが既に12年が経過し内容も古くなっていたこともあり、待望の改訂となりました。この改訂では .NET Framework から .NET Core 世代に変化したような時代に合わせた内容となっています。例えば C# 5 以降に関する記述や Task ベースの非同期、Span<T> などを含むバッファパターンについてなど多くの項目が増えています。

また付録もボリュームがあり、コーディング規約や破壊的変更について、さらには日本語翻訳版独自の翻訳者と監訳者による座談会風の雑感なども収録されて読み応えが増しています。

今では NuGet や GitHub といったものが一般的になりライブラリーを作る人が増えたためそういった方々にお勧めできるのはもちろん、クラスライブラリーに限らずアプリケーションのコードにおいても一貫性や使いやすさといった面で多くの .NET 開発の上で参考になる一冊だと思います。


Umbraco 9 がリリースされました。

Umbraco は .NET 界の中では比較的歴史のあるオープンソースの CMS です。その Umbraco が 9 で .NET Framework から .NET 5 への移行を完了しています。これによりパフォーマンスの向上や開発体験の向上、マルチプラットフォームでの動作が可能となるといった恩恵を受けられるようになったそうです。

Umbraco も実際に .NET Core 世代に移行を検討してから年単位で時間がかかったようなので、先日の Paint.NET のように歴史のあるプロジェクトが .NET 5 以降に移行するものがそろそろ増え始めるのかもしれません。


Visual Studio 2022 for Mac Preview 1 がリリースされました。先日まで Private Preview だったのですが Public Preview として一般公開されました。

Visual Studio 2022 for Mac は目玉として UI の macOS ネイティブ化が進められています。これにより UI のフィーリング(見た目や挙動)が macOS のものと近くなりパフォーマンスと安定性も向上するとしています。またアクセシビリティ面でも VoiceOver の対応といった利点があります。

Preview 1 では主に C# 10 と .NET 6 SDK 対応が含まれており、MAUI の対応は後ほどとなるようです。全体的な UI の再構築を行っていることもあり、現時点では設定画面や一部機能がまだ不完全なところが多くある(未実装や項目が減っている)のでその点は注意が必要です。

トピックス

Umbraco 9 release | Umbraco powered by .NET 5 & ASP.NET Core

https://umbraco.com/blog/umbraco-9-release/

オープンソースの CMS の Umbraco 9 がリリースされた。

2年前からスタートした .NET Framework から .NET 5 および ASP.NET Core へ移行が完了。

.NET 5 へ移行したことによりパフォーマンス向上や Microsoft.Extensions.DependencyInjection や Configuration を元にしたアーキテクチャへの変更による開発しやすさの向上、Windows 以外のプラットフォームのサポートが可能となった。

Visual Studio 2022 for Mac Preview 1 is now available! - Visual Studio Blog

https://devblogs.microsoft.com/visualstudio/visual-studio-2022-for-mac-preview-1-is-now-available/

Visual Studio 2022 for Mac の Preview 1 がリリースされた。Private Preview から Public Preview となったことで登録不要でインストール可能となった。

Visual Studio 2022 for Mac は UI の macOS ネイティブへの刷新がフォーカスされている。これによりパフォーマンスと安定性の向上、操作や表示のフィーリングの改善、アクセシビリティの対応 (VoiceOver) といった恩恵を受けられる。

その他 .NET 6 と C# 10 への対応や Git ツーリングの改善などが含まれている。

Preview 1 では多くの機能が不完全であり(例えば設定画面等)、MAUI への対応ものちの Preview にて提供予定。

ML.NET Updates & Announcing Notebooks in Visual Studio - .NET Blog

https://devblogs.microsoft.com/dotnet/ml-net-and-model-builder-october-updates/

Visual Studio 2022 に .NET のインタラクティブなノートブックを統合する拡張がリリースされた。

以前より .NET Interactive Notebooks や Visual Studio Code 拡張といったものが提供されていたがその Visual Studio 向けの拡張。.NET のインタラクティブなノートブックは ML.NET の Model Builder や .ipynb ファイルを直接作成することで使用可能。

その他 ML.NET のアップデートや、以前フィードバックされていた ML.NET に関する懸念点に関する進捗についてにも触れている。

Release 1.4.0-beta.4 · mysql-net/MySqlConnector

https://github.com/mysql-net/MySqlConnector/releases/tag/1.4.0-beta.4

Async MySQL Connector の 1.4.0-beta.4 がリリース。

不具合の修正のほか ConnectionIdlePingTime オプションの削除など。

.NET 6 RC2 Update for macOS and Windows Arm64 · Issue #21686 · dotnet/sdk

https://github.com/dotnet/sdk/issues/21686

.NET 6 RC2 で macOS と Windows の ARM64 対応がほぼ完了したとのこと。

それにより .NET 6 RC2 以降での macOS と Windows の ARM64 対応は次のような状況となる。

  • x64 版と ARM64 版のインストールの共存可能になる
  • .NET 6 RC2 以降では一度すべての .NET をアンインストールする必要がある
  • コマンドラインから ARM64 のコマンドを使用して x64 の開発が行える (逆も)
  • パフォーマンス上の理由からも ARM64 SDK を使用してほしい
  • SDK は .NET 6+ の ARM64 のみをサポートする
  • ランタイムはすべてのバージョンの ARM64, x64 共にサポートする
  • .NET 6 RC2 で x64 エミュレーションも含む ARM64 の .NET 6 体験を提供
  • .NET Core 3.1, .NET 5 のランタイムも .NET 6 に合わせて更新予定 (ただし時期は未定)
  • RC2 ナイトリービルドは現在壊れているため数週間後にリリースされる RC2 を待ってほしい
  • .NET 5 SDK for Windows ARM64 は .NET 6 RTM 後に早期終了予定

他にもインストールした際にネイティブアーキテクチャーの dotnet コマンドにのみ PATH が通ることやアーキテクチャーを指定する -a 引数が追加されたこと、Windows 11 においては特別な対応がないことなどにも触れている。

Release Release v2.40.0 · grpc/grpc-dotnet

https://github.com/grpc/grpc-dotnet/releases/tag/v2.40.0

Grpc.Net の v2.40.0 がリリースされた。

幾つかの不具合対応、ターゲットフレームワークとして .NET 6 が追加、ProtoBuf のバージョンアップなど。

Release Diagnostics Release - v5.0.248003 · dotnet/diagnostics

https://github.com/dotnet/diagnostics/releases/tag/v5.0.248003

Diagnostics ツールの v5.0.248003 がリリースされた。

各種バグの修正や Microsoft.Diagnostics.NetCore.Client (Diagnostics API) の非同期対応など。

その他 .NET 6 で PDB を配置していなかった場合にメタデータトークンのオフセットがスタックトレースに出力できるようになったが、それから元のコードの位置を割り出す symbolicate コマンドが dotnet-stack に実装された。なおメタデータトークンのオフセットを出力する機能はデフォルトで無効化されているため、Switch.System.Diagnostics.StackTrace.ShowILOffsets AppContext スイッチを有効にする必要がある。

アーティクル、スライドなど

.NET Core API in Azure Container Instances, secured with HTTPS using Caddy2

https://dev.to/kedzior_io/net-core-api-in-azure-container-instances-secured-with-https-using-caddy2-32jm

ASP.NET Core API アプリケーションを Azure Container Instances 上で動かすときに Caddy2 をセットで使用することで簡単に HTTPS 対応をするという記事。

ASP.NET MVC5(.NET Framework)にMicrosoft.Extensions.DependencyInjectionを導入する - Qiita

https://qiita.com/jun1s/items/cedf917a9de98830e97c

.NET Framework の ASP.NET MVC 5 に Microsoft.Extensions.DependencyInjection を導入する方法についての記事。

DependencyResolver に登録するためのアダプターとなるライブラリーを使用することで、ASP.NET MVC のコントローラーでもコンストラクターインジェクションやメソッドパラメーターインジェクションを行えるようにする。

Differences between Hashtable vs Dictonary vs ConcurrentDictionary vs ImmutableDictionary

https://www.hanselman.com/blog/differences-between-hashtable-vs-dictonary-vs-concurrentdictionary-vs-immutabledictionary

.NET はマップ/辞書を実現するクラスが HashtableDictonaryConcurrentDictionaryImmutableDictionary 4種類あるがどう違うのかの記事。David Fowler 氏のツイートから。

Hashtable は .NET 1.x 世代の弱い型付けであり、box 化も発生するため .NET 2.0 以降では Dictionary<TKey, TValue> に変わられた。

スレッドセーフティーを考慮する必要があるのであれば System.Collections.ConcurrentSystem.Collections.Immutable を使用することになる。それを踏まえてそれぞれ次のような違いがある。

  • ConcurrentDictionary: 並列実行時の読み取りは良好、作成は重い、更新速度は遅い
  • ロックあり Dictionary: 読み取りは遅く、作成は軽量、更新速度はまあまあ
  • イミュータブルな Dictionary: 読み取りは最速、作成は軽量、 更新速度はとても遅い
    • イミュータブルな Dictionary とは var newDict = new Dictionary<T,K>(oldDict); newDict.Add(key, value); のようにコピーする方式
  • Hashtable: 読み取りは良好、作成は Dictionary と同様に軽量、更新は重く、ジェネリクスもない
  • ImmutableDictionary: 読み取りは遅め、ロックは不要ただし更新時にアロケーションが多い

SPAセキュリティ入門~PHP Conference Japan 2021

https://www.slideshare.net/ockeghem/phpconf2021spasecurity

Single Page Application におけるフロントエンドを中心としたサーバーとのセキュリティーについてのスライド。

JWT をセッションに使うことについてや、Cookie/localStorage について、CORS などについて落とし穴と共に解説している。

.NET Annotated Monthly | October 2021 | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2021/10/05/net-annotated-monthly-october-2021/

JetBrains による9月から10月にあった .NET 関連の記事やトピックスのまとめの記事。

(C#) 構造体で列挙型ライクな定義を作る - ネコのために鐘は鳴る

https://ikorin2.hatenablog.jp/entry/2021/10/04/043527

Enum (列挙型) の代わりとなるような値/タイプセーフな定義型を作る方法について。

struct として定義することのメリットとして定義外の値を防ぐことやメソッドの定義ができること、内部値の変更が可能といった点があり、デメリットとして定数とできない、デフォルト引数値として扱えない、switch での分岐ができない、Enum の機能を使えないといった点をあげている。

A look at the upcoming improvements to LINQ in .NET 6

https://raygun.com/blog/linq-net-6-improvements/

.NET 6 で強化される LINQ に関する紹介の記事。

Chunk の追加, ElementAt の Index 対応、Take の Range 対応、Zip の3パラメータ版 の追加、FirstOrDefault などでのデフォルト値、TryGetNonEnumeratedCount ヘルパーメソッド、MaxBy/MinBy の追加について。

Hacktoberfest for .NET Developers (C# Edition)

https://dev.to/arafattehsin/hacktoberfest-for-net-developers-c-edition-3bha

Hacktoberfest に参加しコントリビュートを受け付けている .NET (C# 向け) のプロジェクトの紹介記事。

OData with .NET 6

https://dev.to/berviantoleo/odata-with-net-6-5e1p

.NET 6 と PostgreSQL で OData 対応の API アプリケーションを用意するステップバイステップ。

AWS DotNet Lambda Functions powered by AWS Graviton2 Processors (C#, CDK)

https://collin-smith.medium.com/aws-dotnet-lambda-functions-powered-by-aws-graviton2-processors-c-cdk-c7efc160324d

.NET による AWS Lambda Functions を AWS Graviton 2 (ARM) インスタンスの上で動かす記事。

CDK を使用して Lambda Functions のプロジェクトを作成し、デプロイする方法について触れている。

Building a middleware pipeline with WebApplication: Exploring .NET Core 6 - Part 4

https://andrewlock.net/exploring-dotnet-6-part-4-building-a-middleware-pipeline-with-webapplication/

.NET 6 の ASP.NET Core の WebApplication が開始、終了するまでの流れと HTTP ミドルウェアパイプラインの構築についての解説記事。

WebApplication を介してミドルウェアを登録した場合にどのようにしてパイプラインを構築されるかに触れている。

SwitchBot温湿度計の値を、WindowsでC#でBLEで直接受信する - Qiita

https://qiita.com/ShTair/items/3fef7dad7668bd4e8fa5

SwitchBot の温湿度計を .NET 5 と Windows 10 の Bluetooth LE の API を使用して読み取ることについての記事。

GraphQL mutation errors (union erros with interface aka 6a) with Hotchocolate GraphQL Server

https://dev.to/damikun/graphql-mutation-union-erros-6a-with-hotchocolate-graphql-server-1b70

Hotchocolate GraphQL サーバーでミューテーションのエラーを Union と Interface の組み合わせ (Stage 6a) で返す方法についての記事。

Blazor Webassembly SVG Drag And Drop

https://medium.com/codex/blazor-webassembly-svg-drag-and-drop-e680769ac682

Blazor WebAssembly で SVG の要素をドラッグアンドドロップできるようにする実装についての記事。

Exploring C# 10: Save Space with File-Scoped Namespaces

https://dev.to/daveabrock/exploring-c-10-save-space-with-file-scoped-namespaces-1jfi

C# 10 で使用できるファイルスコープの namespace についての記事。

従来の指定方法と混ぜることができない点や、複数回指定できないなどの注意点にも触れている。

ライブラリ、リポジトリ、ツールなど

adamralph/minver: 🏷 Minimalistic versioning using Git tags.

https://github.com/adamralph/minver

Git のタグをベースにアプリケーション/ライブラリーのバージョニングを簡単に行うためのライブラリー/コマンドラインツール。

Marusyk/grok.net: .net implementation of the grok 📝

https://github.com/Marusyk/grok.net

ログ解析などで使用される Grok パターンを解析する .NET 向けライブラリー。

devlooped/WebSocketChannel: High-performance System.Threading.Channels API adapter for System.Net.WebSockets

https://github.com/devlooped/WebSocketChannel

WebSockets をバックにした System.Threading.Channels.Channel<T> の実装。

サーバー/クライアントで Channel インターフェースを通して ReadOnlyMemory<byte> を WebSocket の上で送受信できる。

SonarLint | Code Quality and Code Security starts in your IDE

https://www.sonarlint.org/

ソースコードに問題がある点などを検出する Visual Studio に対応した IDE 拡張。

damikun/trouble-training: FullStack app workshop with distributed tracing and monitoring. This shows the configuration from React frontend to .NetCore backend.

https://github.com/damikun/trouble-training

.NET を使用したフルスタックなアプリケーションのワークショップ。

サーバーアプリケーションのみではなく、フロントエンドやロギング基盤や分散トレーシングなども含む比較的複雑な構成を持つのが特徴。

サイト、ドキュメントなど

WCF 開発者向け ASP.NET Core gRPC - WCF 開発者向け gRPC

https://docs.microsoft.com/ja-jp/dotnet/architecture/grpc-for-wcf-developers/

WCF 開発者に向けた ASP.NET Core の gRPC のガイドとなるのドキュメント。

WCF 開発者以外でも参考となるような gRPC の特性、ProtoBuf について、gRPC のセキュリティーや運用環境での考慮点についても書かれている。

ツイート

クロスプラットフォームなハードウェア Intrinstic なコードを書けるようにするサポートに取り掛かり始めたという話。

C# 10 の String interpolation のハンドラーを使用することで、scanf のようなフォーマットを元に入力をパースして変数にセットするという黒魔術的なテクニック。(実際のコードも危険な雰囲気が漂っている)

.NET 6 の LINQ に関する強化点についてのスレッド。新規追加されたメソッドなどを .NET 5 と比較しながら紹介。

Deep Dive

Add pattern-variables.md by alrz · Pull Request #4592 · dotnet/csharplang

https://github.com/dotnet/csharplang/pull/4592

if (e is (int i, 0))
  Use(i);
else if (e is (0, int j))
  Use(j);

の代わりに

if (e is (int i, 0) or (0, int i))
  Use(i);

のような is パターンマッチ中で同じ型であれば共用できるようにするという提案。

Optimize DateTime.Equals by EgorBo · Pull Request #59857 · dotnet/runtime

https://github.com/dotnet/runtime/pull/59857

DateTime.Equals は Ticks を比較していたが、Ticks は内部表現 (ulong) の上位2ビットをマスクしたものを返すプロパティなので、直接内部表現同士で XOR を取って上位2bitを無視するようにすることでより速くなるというPR。

Guarded Devirt: multiple type checks by EgorBo · Pull Request #59604 · dotnet/runtime

https://github.com/dotnet/runtime/pull/59604

Gurded Devirtualization が「最もよく使われるもの」と「それ以外」だったのを「よく使われるいくつか」と「それ以外」といった形にするというPR。