我正在阅读 this scenario使用 C# using 语句可能会导致问题。如果在 using 语句末尾调用的 Dispose 函数也抛出异常,则在 using block 范围内抛出的异常可能会丢失。这突出表明,在决定是否添加 using 语句时,在某些情况下应格外小心。
我只倾向于在使用流和从 DbConnection 派生的类时使用 using 语句。如果我需要清理非托管资源,我通常更愿意使用 finally block 。
这是 IDisposable 接口(interface)的另一种用途,用于创建性能计时器,该计时器将停止计时器并将时间记录到 Dispose 函数内的注册表中。 http://thebuildingcoder.typepad.com/blog/2010/03/performance-profiling.html
这是对 IDisposable 接口(interface)的良好使用吗?它不会清理资源或处理任何其他对象。但是,我可以看到它如何通过将正在分析的代码整齐地包装在 using 语句中来清理调用代码。
是否有时不应该使用 using 语句和 IDisposable 接口(interface)?在 using 语句中实现 IDisposable 或包装代码之前是否给您带来了问题?
谢谢
最佳答案
我会说,除非文档告诉您不要这样做(如您的示例),否则请始终使用 using
。
让 Dispose
方法抛出异常反而违背了使用它的意义(双关语意)。每当我实现它时,我总是尝试确保无论对象处于什么状态都不会抛出任何异常。
PS:这是补偿 WCF 行为的简单实用程序方法。这可确保在调用 Close
时以外的每个执行路径中调用 Abort
,并将错误传播到调用方。
public static void CallSafely<T>(ChannelFactory<T> factory, Action<T> action) where T : class {
var client = (IClientChannel) factory.CreateChannel();
bool success = false;
try {
action((T) client);
client.Close();
success = true;
} finally {
if(!success) {
client.Abort();
}
}
}
如果您在框架的其他地方发现任何其他有趣的行为案例,您可以想出类似的策略来处理它们。
关于c# - 不应该使用 using 语句和 IDisposable 的场合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3292747/