有没有办法取消' IDisposable构造函数中的using语句?

时间:2016-08-19 15:39:28

标签: c#

我有一个实现IDisposable的自定义类,我用它来包装代码,以便在块结束时自动运行一个函数:

class SdCardOperation : IDisposable {
    SdCardOperation() { SdCardInUse = true; }
    void Dispose() { SdCardInUse = false; }
}

using(new SdCardOperation()) {
    //do some stuff
}

(简化示例)

如果可能的话,我想修改我的类,以便它可以检查是否没有插入SD卡,如果是,则默认不运行using块的内容。我尝试改为调用函数:

IDisposable DoSdCardOperation() {
   if(NoSdcard) return null;
   return new SdCardOperation();
}

但即使使用块接收的IDisposable为null,它仍会运行子块。

根据我的理解,如果我在构造函数中抛出异常,那么将取消'使用块,但我仍然需要捕获异常

2 个答案:

答案 0 :(得分:1)

你不能仅使用using执行此操作,但是如果你创建一个接受Action<SdCardOperation>的函数,你可以让它有条件地运行代码。

class SdCardOperation : IDisposable
{
    /// <summary>
    /// Runs a action on the SdCardOperation only if there is a SD card available.
    /// </summary>
    /// <param name="action">The action to perform</param>
    /// <returns>True if the action was run, false if it was not.</returns>
    public static bool RunOnSdCard(Action<SdCardOperation> action)
    {
        using (var operation = new SdCardOperation())
        {
            if (operation.NoSdcard)
                return false;

            action(operation);
            return true;
        }
    }

    // Your other code here.
}

你会像

一样使用它
bool workWasDone = SdCardOperation.RunOnSdCard((operation) =>
{
    //Do work here with operation
});
//You can check workWasDone here to see if anything was done or not.

答案 1 :(得分:-1)

向班级添加属性bool WillRunMyExitCode。在Dispose()方法中检查其值,并相应地进行操作。