滅入るんるん

何か書きます

csharplang: Disposable pattern

csharplangC# 8.0のマイルストーン、つまりC# 8.0で追加する予定の機能を眺めていたらDisposable patternが追加されてたのでそれの紹介;

Proposal: Allow `using` statement to structurally match `IDisposable`

Disposable patternと勝手に呼んでいますが、中身はusingステートメントでIDisposableインターフェースのみの制約を外そう、つまりDisposeメソッドが定義されていればそちらを呼ぶようにしようという品物です。
 
現状IDisposableを実装するのは結構簡単なわけでメリットを感じられないわけですが、ref structの場合だけはメリットがあります。
そもそもref structはinterfaceを実装できないので、いまのところusingステートメントで使えません。
そこでDisposable patternの出番と言うことです。
 
似たような機能はC#ではいくつかありますが、たとえばforeachでのEnumerator patternではC# 8.0で予定されてるAsync Streamsのついでに拡張メソッドでの定義も許そうと計画されています。
そこで、そのついでにDisposable patternも拡張メソッドまで許そうという話は持ちあがってますが、こちらについてはC#チーム的には考えどころのようです。
 

Using Pattern

それで、すでにRoslynリポジトリのほうにはfeatures/enhanced-usingに作業内容がマージされてます。Disposable patternと勝手に呼んでましたがPR的にはUsing patternのようですね。

内容はforeachでのパターン解析を汎用化して流用といった感じでした。


ということで、問題がなければC# 8.0で追加されることになると思います。