我有一个实现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,它仍会运行子块。
根据我的理解,如果我在构造函数中抛出异常,那么将取消'使用块,但我仍然需要捕获异常
答案 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()
方法中检查其值,并相应地进行操作。