c# - 不应该使用 using 语句和 IDisposable 的场合

标签 c# .net using-statement

我正在阅读 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/

相关文章:

c# - 如何使用 .Net 4.0 中的 HttpClient 将 XML 响应解析为 .Net 类?

c# - 使用语句中的 MemoryStream - 我是否需要调用 close()

c# - 如何使用 ASP.NET 在 Azure SQL 中进行应用程序级数据加密?

c# - 清理事件处理程序引用的最佳做法是什么?

c# - 有没有办法将 C# 序列化对象读入 Python?

c# - 具有 BoundedCapacity 的 BufferBlock 和 ActionBlock 不使用最大 DOP

c# - 表格的宽度不能小于 140 像素。为什么?

.NET 程序集引用编译时错误

c# - 嵌套 using 语句的最佳实践?

.net - 何时使用 Using 语句