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
- Editor Review
- Chief Editor Action