BT

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

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース C# 7.1 と C# 7.2 をキャッチアップする

C# 7.1 と C# 7.2 をキャッチアップする

原文(投稿日:2017/11/02)へのリンク

Visual 15.3 の一部として、 Microsoft は .NET 1.1 以降初めて C# のポイントリリースを行った。 C# 7.1 は 3 つの新しい機能があり、うち 2 つは機能する。

default リテラル C# 7.1/7.22

default リテラルの背後にある考えは、決まり文句のようなコードを除去することだ。よくある例として以下のようなものがある。

public Task<Order> GetOrderAsync(int orderKey, CancellationToken token = default(CancellationToken))

これは冗長なため、 Visual Basic の Nothing キーワードのように以下のように書ける。

public Task<Order> GetOrderAsync(int orderKey, CancellationToken token = default)

そしてこれは期待通りに動作する。問題は null 許容の値型を使用した場合に発生する。

public Task<Order> GetOrders(int? limit = default)

これは null に制限パラメーターを設定すべきだが、 C# 7.1 では実際は 0 を返す。

この課題の修正 は C# 7.2 で予定されており、 Visual Studio 15.5 とともにリリースされる。

Tuple 名の推論 C# 7.1

匿名型が導入されてから、 C# はプロパティの名前付けを暗黙的に行うことができるようになった。例えば、以下のように記述するとオブジェクト y は A と B と名前付けられたプロパティをもつようになる。

var y = new { x.A, x.B };

C# 7.1 では、値タプルもこの能力をもつ。

var z1 = (A: x.A, B: x.B); //explicit names
var z2 = (x.A, x.B); //inferred names

タプル名の推論に関する過去の記事をチェックしてほしい。

非同期 Main C# 7.1

ここで説明することは無い。Main 関数は非同期で実行でき、それによってこれまで必要だった冗長なコードが除去される。

条件付き refC# 7.2

C# の条件付き演算子はこの言語で唯一のものであるため「三項演算子」とも呼ばれる。 C# 7.2 では、条件付き ref 演算子と呼ばれる、第二の三項演算子が使用できるようになるだろう。

この小さな機能により ref 式が条件的に使用できるようになる。提案からの例は以下のとおり。

ref var r = ref (arr != null ? ref arr[0]: ref otherArr[0]);

ref キーワードを 2 つの起こりうる結果の隣に記述することに加え、式全体を括った括弧にも ref キーワードが必要であることに注意されたい。

リーディングセパレーター C# 7.2

この機能は、数値リテラルに下線を使用できる機能の拡張である。以下は提案からの引用だ。

123 // permitted in C# 1.0 and later

1_2_3 // C# 7.0 以降で許可された
0x1_2_3 // C# 7.0 以降で許可された
0b101 // C# 7.0 で追加されたバイナリリテラル
0b1_0_1 // C# 7.0 以降で許可された

// C# 7.2 では、 `0x` や `0b` の後に _ が許可された
0x_1_2 // C# 7.2 以降で許可される
0b_1_0_1 // C# 7.2 以降で許可される

non-trailing な名前付き引数 C# 7.2

C# における名前付き引数には 2 つの目的がある。

  • オプション引数を省略できる
  • プロバイダーの明快性、特にブール型引数において

この機能は後者を扱う。説明しよう。

void DoSomething(bool delayExecution, bool continueOnError, int maxRecords);
DoSomething(true, false, 100);

この関数シグネチャを記憶していなければ、 true と false のいずれを適用すればいいのかひと目ではわからない。これまでは以下のように記述できた。

DoSomething(delayExecution: true, continueOnError: false, maxRecords: 100);

しかし、疑いようがないのに maxRecords の名前を特定しなければならないのは奇妙だ。 non-trailing な名前付き引数 non-trailing な名前付き引数の提案に従えば、必要なパラメーターのみ特定すればよい。

DoSomething(delayExecution: true, continueOnError: false, 100);

編者の注記: 明快性が課題となるときは Boolean よりも Enum のほうが良い。

Private Protected C# 7.2

C# では 5 つのアクセシビリティレベルがある。 private、 internal、 protected または internal、そして public だ。しかし CLR では FamAANDAssem と呼ばれる、「同一アセンブリにあるサブタイプからのみアクセス可能な」 6 つめのアクセシビリティが存在する。

トリビア: CLR では、「protected」は「family」、「internal」は「assembly」と呼ばれる。

新しいキーワード「private protected」では、開発者は CLR の FamANDAssem を使用できるようになる。 Private Protected の提案は、これがいかに重要かを説明している。

ある API が、型を提供するアセンブリに含まれるサブクラスから実装され、使用されることのみを意図しているという状況はよくあります。 CLR にはこの目的のためのアクセシビリティがありますが、 C# で使用することはできません。結果として、 API オーナーは internal による保護と自制、またはカスタムアナライザを使用するか、あるいは、そのタイプのパブリックドキュメントにメンバーが現れるが、パブリック API の一部として使用されることを意図していない、ということを追加のドキュメントで説明して protected を使用することをしいられています。後者の例としては、 Roslyn の Common から始まる CSharpCompilatioinOptions のメンバーを参照してください。

読み取り専用参照型 C# 7.2

以前読み取り専用参照型については取り上げているため、ここで新しく説明することは無い。これは本質的には、構造体を参照渡しすることでパフォーマンスの利点を得たいことを表すための手段だが、実際に値を変更することはできない。

現在のところ、この読み取り専用参照型の提案がプロトタイプとしてマークされているが、まだ実装されていない。

Compile time enforcement of safety for ref-like types [7.2 Proposal]

この C# の機能は interior 演算子、または ref-like 型として知られる。この提案によって、コンパイラは Span<T> のようなスタックにのみ現れる特定の型を要求することもできるようになる。高パフォーマンスを求められる状況においてのみ重要だが、 ref-like 型の提案は以前我々が報告して以降、変更はない。

ドロップされた機能

これらの機能は、現在は 7.2 の提案の一部としてマークが外れている。これは、これらが今後も実装されないということではなく、おそらくすぐには実装されないということ意味する。

Rate this Article

Adoption Stage
Style

この記事に星をつける

おすすめ度
スタイル

BT