デフォルトインターフェイスメソッドとnull許容参照のような大きなチケットアイテムに注意されがちだが、C# 8では小さな機能も検討されている。このサンプルはC#の将来バージョンになる可能性もある。
新しい代入演算子: &&= と ||=
最初のバージョン以来C#は、他の演算子と組み合わせた構文をサポートしている。これにはほとんどバイナリ演算子(+, -, & など)が含まれ、ブーリアン演算子&& と ||をショートカットすることを期待している。 「&&= と ||= 代入演算子」はこのリストを完了させる。
逐語的補完文字列
逐語的な文字列は@"から始まる。保管された文字列は$"から始まる。もし、逐語と補完の両方が必要な時はどうしたらよいか?@$"それとも$@"? 現在、一方が通り、もう一方はコンパイルエラーになるが、どちらだったかを思い出すのは難しい。
逐語的補完文字列と呼ばれる控えめな提案は、@$"を受け入れるように構文を拡張する。これは補完逐次的文字列($@")と同じように動作するため、後方を気にする必要がない。
この変更には、不要である、不一致を引き起こす、などの小さな議論が存在する。
`using`ステートメントが`IDisposable`と構造的に一致することを許可する
インターフェイスはC#コンパイラと不思議な関係にある。多くの場合、言語機能を使うために特定の抽象インターフェイスを実際に実装する必要はない。抽象インターフェイスに似たクラスのpublic APIを作ればよい。
古典的な例は`foreach`とIEnumerableである。もしクラスにGetEnumeratorというメソッドがあって、CurrentプロパティとMoveNextメソッドを持つオブジェクトが返されるとしたら、foreachを使える。実際には返される型は問題ではなくて、List<T>などのクラスではより高速な列挙子を実装できる 。これは「構造マッチング」と呼ばれる。
この提案では`using`ステートメントも構造マッチングがサポートされる。 IDisposableを実行しない破棄可能なクラスを見ないため、最初は有用ではない。しかし、ref構造体と呼ばれる新しい種類の型が存在する。これはインターフェイスを実装できないため、この提案なしではusingステートメントを使用できない。
foreachとusingの拡張メソッド
以前の提案のフォローアップでは、GetEnumeratorやDisposeを拡張メソッドとして追加することで、`foreach`や`using` を使用できるようになる。ここでは非常な特別な状況で使用する機能のみ言及している。例えば、Dispose拡張メソッドを、サードパーティライブラリであるCOMオブジェクト追加する(ことで、適切な場所でMarshal.ReleaseComObjectが呼び出せる)。
これはまだ正式な提案ではなく、前述の`using`ステートメントの変更に組み込むことができる。
暗示的な`using`ステートメントのスコープ
現在、`using`ステートメントは明示的なスコープ(つまり2つの中括弧)または、他の`using` が続く必要がある。この提案が通ると、以下のように書くことができるようになる:
using var a = new MyDisposable();
using var b = new MyDisposable();
using var c = new MyDisposable();
各変数は、現在のスコープを抜けると自動的に破棄される。機能的にはこれと同等だが、冗長性が少なく新しいスコープに入ることがない。
using (var a = new MyDisposable())
using (var b = new MyDisposable())
using (var c = new MyDisposable())
{
// Some code
}
この変更は、破棄可能なオブジェクトが複数必要な時に特に便利だが、全てが同時に作られるわけではない。現在のスコープの最後に破棄されることを信じて、式の途中で破棄可能なオブジェクトを作ることもできる。
var results = myExcelReader.ReadResults(using new MyExcelSheet(excelFilePath));
この提案のひとつの批判は、`goto`などいくつかのステートメントと互換性がないことである。
Rate this Article
- Editor Review
- Chief Editor Action