BT

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

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース C# 8.0プレビュー

C# 8.0プレビュー

原文(投稿日:2017/08/23)へのリンク

Channel 9のビデオにおいて、Mads Torgersen氏はC# 8の最初の4機能をデモした。

Null許容参照型

我々は以前から Null許容参照型をカバーしてきたが、簡単にこのアイディアを説明すると、参照型がデフォルトでNull許容にならなくなるということである。代わりにあなたは、値型をNull許容にするのと同じように“Type?”という構文を使用して、明示的に指定する必要がある。

非Null許容型にnullを代入すると、コンパイラが警告する。同様に、Null許容型から値を読み込むときに事前にNullを明示的にチェックしていない場合は、コンパイラが警告する。つまり開発者に必要とされるのは、適切なタイミングでクエスチョンマークを付けるだけである。

私達のレポート以降、この機能には新しい構文が追加された。Null許容変数xが実際にはnullではないことがわかっているシナリオでも、それをコンパイラが証明することはできない。このケースの場合、x!.Method()を使用することで、潜在的なnull参照例外に対するコンパイラ警告を押さえることができる。

非同期ストリーム (foreach asyncとしても知られる)

非同期ストリームはIEnumerableの非同期同等機能である 以前、私達がレポートした非同期ストリームで、彼らは2015年から取り組んでいることがわかる。議論の結果、彼らが解決した構文は以下の通り:

foreach await (string s in asyncStream)

非同期イテレータを定義するときには、この関数シグニチャを使用する:

async IAsyncEnumerable<T> MethodName()

通常のIEnumerableメソッドと同様に、遅延の方法でオブジェクトのストリームを構築するために“yield return”を使用できる。

Reactive ExtensionsではなくIObservable<T>を使う利点は、利用者が流量を制御できる点である。これは“プルモデル”と呼ばれる。対象的にIObservable<T>は“プッシュモデル”であり、生成側は消費側が処理できる量よりも多く放出できる。

デフォルトインターフェイス実装

デフォルトインターフェイス実装は、基本的には多重継承の限定された形式である。これにより抽象インターフェイスは、抽象クラスのように完全なメソッドを定義できる。ただし、抽象インターフェイスはコンストラクタやフィールドを宣言することはできない。

注: ConditionalWeakTableを使ってインターフェイスのフィールドをシミュレートできる。

デフォルトインターフェイス実装の主な利点として、下位互換を損なうことなく既存のインターフェイスに新しいメソッドを追加できることだ。これは保証されているわけではなく、考慮可能な適切なデフォルトメソッドがあるときのみ機能します。

これは非常に議論を巻き起こす機能だ。ここでその議論を繰り返すことは避けるが、以前の記事であるデフォルトインターフェイス実装において、この要約を読むことができる。

Extension(拡張) Everything

長年、C#に対する苦情のひとつは拡張メソッドはかけるが、拡張プロパティが書けないことであった。実際のところ、現在のパターンを使って、拡張プロパティやイベントを定義する方法がない。加えて、静的クラスに拡張メソッドを追加することは、多くの人に取って奇妙なことであった。

新しい設計では「extension(拡張)」と呼ばれる新しいトップレベル構造がある。たとえばCustomerクラスの拡張メソッドとプロパティを作成する場合、以下のように書ける:

extension CustomerExt extends Customer {
    //methods and properties go here
}

インターフェイスと同様にextensionsにインスタンスフィールドの定義できないが、ConditionalWeakTableを使ったシミュレートはできる。静的フィールドの定義も可能だ。

プロパティ、イベント、演算子オーバーロードに加えて、コンストラクターの拡張も可能にしようと考えている。Extensionコンストラクタは、ファクトリとオブジェクトプールのシナリオにおいて、非常に興味深いだろう。

拡張インターフェイス

既存のクラスに新しいインターフェイスを追加したり、検討したりする拡張インターフェイス。これはC# 8の機能ではなく、基本的なランタイムを変更する必要がある。

C#の未来に関する詳細は、C#言語設計レポを確認してほしい。

 
 

Rate this Article

Adoption Stage
Style
 
 

この記事に星をつける

おすすめ度
スタイル

BT