kledgeb UbuntuやLinuxの最新情報を紹介

.NET Standard 2.1の紹介

2018年11月5日、以下で「.NET Standard 2.1」が紹介されています。



.NET Standardとは

「.NET Standard」は各種APIを定めた仕様書です。
仕様書ですので「.NET Standard」自体はソフトウェアではありません。


例えば「.NET Core」は「.NET Standard」で定義された仕様を実装したソフトウェアの1つです。
他にも「.NET Standard」をサポートしたソフトウェアが存在します。

共通仕様

「.NET Standard」をサポートしたソフトウェアが「.NET Standard」のみをサポートしているというわけではありません。
「.NET Standard」で定義されていないAPIを実装していることもあります。


「.NET Standard」は.NETプラットフォームにおける共通仕様であり、実装が仕様を追い越すことも、既存の実装から仕様に落とし込むこともあります。
後者に関しては「.NET Standard」が後から出てきた仕組みであるためです。
「.NET Standard」は.NETプラットフォームにおけるサブセットと捉えることもできるでしょう。

仕様書にもバージョンがある

世の中に存在する仕様書の多くがそうであるように、「.NET Standard」にもバージョンがあります。
現時点で「.NET Standard 2.1」を実装した「.NET Core」はリリースされていません。
現在最新版の「.NET Core 2.1.5」は、「.NET Standard 2.0」を実装したソフトウェアです。

.NET Standardの目的

「.NET Standard」の目的は、デスクトップアプリケーション、モバイルアプリケーション及びゲーム、クラウドサービスなど、.NET開発者が必要とする様々な分野で横断的にコードを共有できるよう、コードの共有に関する問題を解決することです。

「.NET Standard」に基づいた実装により、プラットフォームが異なっていても大きくコードを書き直すことなく既存のコードを活用し、開発コストやメンテナンスコストを抑えることができます。

.NETプラットフォームに統一性を

「.NET Standard」は、すべての.NETプラットフォームで実装しなければならないAPI群を定義しています。
「.NET Standard」により.NETプラットフォームに統一性を持たせ、将来起こりうるであろう.NETプラットフォームの分断を防ぎます。

PCL(ポータブルクラスライブラリー)を置き換える

「.NET Standard」は似たような目的を持つ「PCL」を置き換えます。

.NET Standardのバージョンとその実装

どのソフトウェアがどのバージョンの「.NET Standard」を実装しているか確認するには、以下を参照してください。


また各「.NET Standard」のバージョンに対応したリファレンスも上記で参照できます。

.NET Standard 2.1

さて「.NET Standard 2.1」の仕様が確定された後、「.NET Standard 2.1」を実装したソフトウェアが登場することになります。


アップデートを行う良い時期

現在「.NET Core 2.1.5」がリリースされており、今後「.NET Core 2.2.0」がリリースされる予定です。
開発チームは今が「.NET Standard」のアップデートを行う良い時期と考えており、新しい仕組みの導入や既存機能の細かな改良を行い、「.NET Standard 2.1」により.NETプラットフォーム全体の共通化の強化及び改良を行う方針です。

ここでは「.NET Standard 2.1」で導入されるであろう注目機能を紹介します。

約3,000のAPIを追加

「.NET Standard 2.1」では、「.NET Standard 2.0」から約3,000のAPIが追加される予定です。
これらのAPIの多くは新規APIですが、.NETプラットフォームの統一性をさらに高めるために追加された既存APIもあります。

Span<T>の導入

「Span<T>」自体はすでに「.NET Core 2.1」で導入されています。
「Span<T>」は配列のような型であり、マネージド及びアンマネージドメモリー上に存在するデータを同じ手法で扱うことができます。
またメモリー上でデータをコピーすることなく、データの抜き出し(スライス)も可能です。

「.NET Core 2.1」にとって「Span<T>」の導入は、最もパフォーマンスの向上に寄与する改良でした。
「Span<T>」はより効果的な方法でバッファーを管理できるため、メモリーの確保やデータコピーの削減に役立ちます。

「Span<T>」をもっと活用してもらうためにはランタイムやコンパイラーによる「Span<T>」のサポートが必要であり、開発チームは「Span<T>」を基本型としての導入を検討しています。

「Span<T>」に関する詳細は、以下を参照してください。


Span<T>と連携して動作する基本APIの追加

また「Span<T>」と連携して動作する基本APIの追加も行われます。

現在でも「.NET Standard」互換の「NuGet(System.Memory)」パッケージの導入により「Span<T>」を利用することもできましたが、このパッケージを導入すると「Span<T>」を扱う.NET標準型のメンバーを拡張することができなくなります。

Reflection emit

.NETエコシステムでは生産性向上のために、「Reflection(リフレクション)」や「Reflection Emit」といった動的な機能が常に多用されています。

「Emit」はパフォーマンスを最適化する手段として、そしてプロキシーインターフェースのタイプを簡単に生成する手段として良く利用されます。
そのため開発者から「Reflection Emit」を「.NET Standard」に含んで欲しいとの要望が数多く挙げられました。

元々この機能は「NuGet」パッケージ経由での提供が考えられていましたが、パッケージを活用したコア技術モデルの確立は困難なことが分りました。

「.NET Standard 2.1」では「Reflection Emit」と同様に「Lightweight Code Generation(LCG)」にアクセスできるようになります。
またコード生成に関する以下のAPIも追加されています。

  • RuntimeFeature.IsDynamicCodeSupported
  • RuntimeFeature.IsDynamicCodeCompiled

SIMD

「.NET Framework」及び「.NET Core」では、すでに「SIMD」がサポートされています。


「SIMD」は文字列の比較など「Base Class Library(BCL)」内の基本操作の処理速度向上に活用されています。
この機能はランタイムのサポートが必要であり、開発者から「.NET Standard」に含んで欲しいとの要望が数多く挙げられました。

ValueTaskとValueTask<T>

「ValueTask<T>」は「Task<T>」を割り当てることなく、完了した処理の処理結果を同期的に受け取ることができます。
「ValueTask<T>」はすでに存在していますが、その対になる非ジェネリック版の「ValueTask」により、メモリー確保の程度を減らすことができます。

DbProviderFactories

「DbProviderFactories」によりライブラリーやアプリケーションは、コンパイル時に特定のADO.NETプロバイダーのタイプを知らなくても、名称に基づき登録された「DbProviderFactory」インスタンスを指定することで、そのADO.NETプロバイダーを活用できるようになります。

その他

「.NET Core」はオープンソースであり、「.NET Core」で導入された改良が「.NET Standard 2.1」にも追加されます。
これには「System.HashCode」の改良や「System.String」の新しいオーバーロードが含まれます。

.NET Core 3.0で.NET Standard 2.1をサポート

「.NET Standard 2.1」は「.NET Core 3.0」でサポート予定です。
一方「.NET Framework 4.8」では、「.NET Standard 2.0」のサポートに留まります。
これは「.NET Core」と「.NET Framework」にポリシーの違いがあるためです。

.NET Frameworkのポリシー

「.NET Framework」は、10億以上のマシンにインストールされる.NETの実装であり、可能な限り互換性を維持する必要があります。
そのため「.NET Core」よりもゆっくりとした速度で変化していきます。

アプリケーションは既存の「.NET Framework」の振る舞いに依存しているため、セキュリティーの改善や不具合の修正でさえも、アプリケーションが動作しなくなる原因になり得ます。

「.NET Framework」は、常に最新のネットワークプロトコルやセキュリティー標準、そして「Windows」の機能をサポートするように開発されています。

.NET Coreのポリシー

「.NET Core」はオープンソースかつクロスプラットフォームで開発されており、積極的に開発されている.NETの実装です。
「.NET Framework」ではポリシーのためサポートできない新しいAPIや言語機能が積極的に追加されます。

ランタイムの変更が必要

「.NET Standard 2.1」では約3,000のAPIが追加されるため、「.NET Standard 2.1」に対応するにはランタイムの変更が必要になります。
そのため「.NET Framework 4.8」では互換性を維持するため、「.NET Standard 2.0」に留まるのが望ましいとの判断が行われています。

「.NET Standard 2.1」は「.NET Core 3.0」でサポートされると共に、「Xamarin」「Mono」「Unity」 の新しいバージョンでも「.NET Core 3.0」がサポートされる予定です。

.NET Standard 2.0に留まる判断

「.NET Framework」を利用する顧客にライブラリーを提供し、そのライブラリーの開発者がその顧客をサポートする必要がある場合は、「.NET Standard 2.0」に留まることをお勧めします。

「.NET Standard 2.1」で追加されるAPIの多くは、高度な使い方(シナリオ)を実現するためのものです。
実際多くのライブラリーは「.NET Standard 2.0」に留まれるでしょう。

ただしライブラリーの開発者は、例え「.NET Framework」をサポートする必要があるとしても、「.NET Standard 2.1」で追加されるAPIを活用できないということではありません。
マルチターゲットを利用し「.NET Standard 2.0」及び「.NET Standard 2.1」の双方でコンパイルできます。 
詳細については、以下を参照してください。


.NET Standard 2.0の進捗

「.NET Standard 2.0」の進捗は、以下を参照してください。


関連コンテンツ
同一カテゴリーの記事
コメント
オプション