C# 8.0での追加目標で、using ステートメント絡みの機能が2つほど。

1つは、パターン ベース(IDiposableインターフェイスの実装不要)でusingが使えるようになるというもの。 もう1つは、変数宣言・変数のスコープに紐づいたusing

パターン ベースで using

C# の言語機能のいくつかは、単にメソッド呼び出しに変換するだけのシンタックスシュガーが多いです。 foreachawait、クエリ式など、いろんなものが「この名前のメソッドさえ実装していればどんな型でも使える」という類の構文になっています。 ですが、微妙にものによって挙動が違ったり。

ということで、インターフェイスの実装が必須で使い勝手が悪かったusingステートメントですが、C# 8.0で、これを「Dispose()と言うメソッドさえ持っていれば何でも使える」というものに変えるようです。

というのも、ref構造体がインターフェイスを実装できないものの、ref構造体でusingを使いたい場面が非常に多い状況になっているので。 パターン ベースなusingの需要がかなり上がっているみたいです。

ちなみに、これはusingに限った話ではなく、上記のような挙動の差をなくしたいという話でもあります。 C# 8.0では他にも「非同期 foreach」みたいな話もあって、これと関連して、上記の「foreachが拡張メソッドのGetEnumeratorを受け付けないのは変じゃない?」みたいなことも言われています。こちらもセット。

using 変数宣言

これまで、usingを使うときには以下のような書き方でした。

using (var d = someDisposable)
{
    // このスコープ内を抜けたら Dispose
}

で、C# 8.0 では、以下のような書き方を認めようという話です。

{
    // 変数宣言と同時に、その変数を using
    using var d = someDisposable;

    // 変数のスコープを抜けたら Dispose
}

C# の言語機能としては「using修飾付きの変数宣言」みたいになるようです。

この機能を追加する主な動機は、以下のような「usingの入れ子」の解消です。

// 同寿命のリソースを何個も使うとき、こんな感じになる
using (var a = someDisposable)
using (var b = anotherDisposable)
using (var c = oneMoreDisposable)
{
    // ここを抜けたら Dispose
}

// それをこう変えたい
using var a = someDisposable;
using var b = anotherDisposable;
using var c = oneMoreDisposable;

// メソッドを抜けたら Dispose

これも、fixedステートメントにも同じことが言えそう(同寿命で重ねることが結構ある)ということで、 同じような「fixed変数宣言」も考えているそうです(こちらはたぶんC# 8.0よりも将来の話)。