首页 > 解决方案 > 自定义类的工作方式类似于带有花括号的 using 语句

问题描述

是否可以创建一个像using那样工作的类或运算符?

例子:

using (IDataReader reader = cmd.ExecuteReader())
{
  while (reader.Read())
  {
    count++;
  }
}

通常我们使用using语句来不必手动处理 post 操作,诸如此类dispose

我想到了这个机制的几个用法。
但我无法弄清楚如何实现这一目标。

一个实际实现的例子:

  MyClass mc = new MyClass();
  MyClass sub = mc.GoDown();
  //Do things on sub
  sub.GoUp();

我希望它是什么:

  MyClass mc = new MyClass();
  mc.GoDown {
    //Do things on sub
  } // GoUp

我知道我可以使用try {} finally {}. 我只是好奇是否有办法做using正在做的事情。

编辑:我确实知道IDispose实施。我只是想知道我们是否可以做using没有using.

编辑#2:改进了示例。

标签: c#design-patterns

解决方案


以下是通过传入Action<MyClass>toGoDownGoDown处理调用GoUpon来使示例工作的方法sub

public class MyClass
{
    public MyClass GoDown(Action<MyClass> doStuff)
    {
        var sub = new MyClass();
        //Whatever GoDown did to create a MyClass goes here

        try
        {
            doStuff(sub);
        }
        finally
        {
            sub.GoUp();
        }
    }
}

然后这样称呼它。

MyClass mc = new MyClass();
mc.GoDown(sub =>
{
    //Do things on sub
});

即使您传入的委托中有异常,也会GoUp被调用。sub


推荐阅读