BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース C# 12の新機能:プライマリコンストラクタ、コレクション式などが発表

C# 12の新機能:プライマリコンストラクタ、コレクション式などが発表

原文リンク(2023-11-17)

11月14日、マイクロソフトは.NET 8発表の一環として、人気の.NETプログラミング言語の最新バージョンであるC# 12の新機能を発表した。もっとも注目すべき改良点は、コレクション式、すべてのクラスと構造体のプライマリコンストラクタ、任意の型のエイリアスを作成する構文、ラムダ式のデフォルトパラメータなどである。

C# 12では、プライマリコンストラクタの拡張が導入され、レコードのみに限らず、すべてのクラスと構造体にこの機能が含まれるようになった。この拡張により、クラス宣言内で直接コンストラクタパラメータを定義できるようになった。

プライマリコンストラクタパラメータは、base() コンストラクタ呼び出しの引数として機能したり、メンバーフィールドやプロパティの初期化を促したり、インスタンス・メンバ内で参照したり、定型コードを排除して依存性注入を容易にしたり、といった多目的な用途がある。

public class BankAccount(string accountID, string owner){    public string AccountID { get; } = accountID;    public string Owner { get; } = owner;    public override string ToString() => $"Account ID:{Owner: {Owner}";}

(出典: Microsoft .NET DevBlog、Announcing C# 12)

プライマリコンストラクタパラメータはクラス全体のスコープパラメータとして動作し、クラス、構造体、レコードクラス、レコード構造体など、さまざまな型に適用できる。特筆すべきは、レコード型に適用した場合、コンパイラは各プライマリコンストラクタパラメータに対して自動的にパブリックプロパティを生成し、これにより、レコード構造体のメンバ管理を簡素化できる点が挙げられる。

コレクション式も導入され、さまざまなコレクションを作成する構文が簡素化、統一されたアプローチが提供される。前述のように、これにより配列、リスト、スパンを初期化する際に個別の構文を使用する必要がなくなる。コンパイラは効率的なコードを生成することで、コレクションの容量を最適化し、不必要なデータコピーを回避する。

int[] x1 = [1, 2, 3, 4];int[] x2 = [];WriteByteArray([1, 2, 3]);List<int> x4 = [1, 2, 3, 4];Span<DateTime> dates = [GetDate(0), GetDate(1)];WriteByteSpan([1, 2, 3]);

さらに、新しいスプレッド演算子は、複数のコレクションからの要素の取り込みを単純化した。チームは、この機能は、今後のC#バージョンでの辞書やvar(自然型)のサポートを含む、将来の拡張の可能性についてのフィードバックを受け付けている、と述べている。

int[] numbers1 = [1, 2, 3];int[] numbers2 = [4, 5, 6];int[] moreNumbers = [... numbers1, ... numbers2, 7, 8, 9];// moreNumbers contains [1, 2, 3, 4, 5, 6, 7, 8, ,9];

C# 12のパフォーマンスに関しては、ref readonly パラメータとインライン配列の2つの新機能が導入されたことで生メモリの処理が強化され、アプリケーションのパフォーマンスが向上した。ref readonlyパラメータは、参照または値によるパラメータの受け渡しに適応するアプローチを提供し、特にメソッドが引数のメモリ位置を変更せずに必要とする場合に有益である。

構造体ベースの固定長配列型であるインライン配列は、メモリバッファを安全に扱う方法を提供し、安全でないコードを必要とせずに構造体の配列を含むシナリオのパフォーマンスを向上させる。これらの追加機能により、開発者はコードを最適化して効率を高めることができる。

[System.Runtime.CompilerServices.InlineArray(10)]。public struct Buffer{    private int _element0;}// Usagevar buffer = new Buffer();for (int i = 0; i < 10; i++)    buffer[i] = i;foreach (var i in buffer)    Console.WriteLine(i);

さらに、Experimental属性インターセプターという2つの実験的な機能が実装された。Experimental属性は、実験的機能のステータスを明確にするもので、エラーを避けるために呼び出し元のコードを実験的とマークする必要がある。インターセプターは、メソッド呼び出しのリダイレクトを可能にし、最適化の可能性を提供する。

インターセプターは変更の可能性があるため、実運用には推奨されないが、どちらの機能も、実験的なコードにおける明確性と一貫性のためにExperimental属性を使用することの重要性を強調している。

C# 12のその他の機能としては、ラムダ式にオプションのパラメータを追加できるようになったことと、 usingaliasディレクティブで(名前付き型だけでなく)あらゆる種類の型のエイリアスを作成できるようになったことが挙げられる。これにより開発者は、タプル型、配列型、ポインタ型、その他の安全でない型のセマンティック・エイリアスを作成できる。

Func<int, int, bool> testForEquality = (x, y) => x == y;

オリジナルの発表ブログ記事のコメント欄には、C#言語の改善点や提案に関する興味深いアイデアがいくつか寄せられ、さまざまなスレッドやフォーラムに基づくコミュニティ全体のフィードバックは肯定的なものだった。

dotnetの公式YouTubeチャンネルでは、「What's New in C# 12」というタイトルで、.NET 8の発表セッションの録画が35分にわたって公開されているので、開発者にはぜひ視聴をお勧めしたい。

利用可能なC# 12の機能については、公式の言語ドキュメンテーションページで確認できる。開発者は、.NET 8、最新のVisual Studio、またはVisual Studio CodeのC# Dev Kitをダウンロードして入手できる。

作者について

この記事に星をつける

おすすめ度
スタイル

BT