構成を使用するコードブロックがデリゲートとして関数に渡される場合、C#に「Usable」パターンがあればいいのにと思います。
class Usable : IUsable
{
public void Use(Action action) // implements IUsable
{
// acquire resources
action();
// release resources
}
}
およびユーザーコード:
using (new Usable())
{
// this code block is converted to delegate and passed to Use method above
}
長所:
- 制御された実行、例外
- 「Usable」を使用した事実は、コールスタックに表示されます
短所:
- 代理人の費用
それは実現可能で有用だと思いますか、そして言語の観点から問題がなければ?あなたが見ることができる落とし穴はありますか?
編集:デビッドシュミットは次のことを提案しました
using(new Usable(delegate() {
// actions here
}) {}
このようなサンプルシナリオでは機能しますが、通常はリソースがすでに割り当てられており、次のように表示する必要があります。
using (Repository.GlobalResource)
{
// actions here
}
GlobalResource(はい、グローバルリソースが悪いことは知っています)がIUsableを実装している場合。あなたが書き直すことができるのは短いです
Repository.GlobalResource.Use(() =>
{
// actions here
});
しかし、それは少し奇妙に見えます(そして、インターフェースを明示的に実装するとさらに奇妙になります)。これはさまざまなフレーバーで非常によくあることなので、言語の新しい構文糖衣に値すると思いました。