【问题标题】:PetaPoco.Database implements IDisposable, so why don't most examples have a 'using' statement?PetaPoco.Database 实现了 IDisposable,那么为什么大多数示例没有“使用”语句呢?
【发布时间】:2016-01-31 09:02:15
【问题描述】:

PetaPoco.Database 对象实现了 IDisposable,但我很少看到包含如下 using 语句的代码示例(包括 PetaPoco 的 own website):

using (var db = new Database("MyConnectionString"))
{
    // Do database stuff
}

大多数时候我只是看到:

var db = new Database("MyConnectionString");
// Do database stuff
// I never see .Dispose() called.

实际上应该如何处理 PetaPoco.Database 对象?

【问题讨论】:

  • 如果它实现了 IDisposable 你应该确保调用 Dispose。而且,无论如何,如果 Dispose 方法什么都不做,你就没有什么可松动的
  • 但是如果 IDisposable 被实现了,那么我不应该把它放在一个“使用”块中,因为这通常是“使用”的使用方式吗?
  • @Howiecamp 是的,你应该这样做。他们没有在示例中这样做,因为当 AppDomain 被程序销毁时,GC 会处理它。
  • @Behrooz - 谢谢。但不确定如果这样做是最佳实践,为什么不会在示例中显示它。当 AppDomain 被销毁时,GC 当然总是会处理所有事情,但是 IDisposable 的全部意义在于您希望在此之前很久就释放这些资源。所以我不确定我是否理解那里的逻辑。
  • @Howiecamp 我认为您比他们更了解逻辑。他们不是神。

标签: c# .net dispose idisposable petapoco


【解决方案1】:

IDisposable 告诉 GC 当它想要摆脱 object 时该怎么做。
using 要求 GC 在其范围结束时摆脱 object
using 与不是IDisposableobject 一起使用是没用的。

【讨论】:

  • 但 PetaPoco.Database 确实支持 IDisposable。
  • @Howiecamp 这并不违反我所说的。见我上面的其他评论。我只说了 3 点。
  • 但是由于对象确实实现了IDisposable,那么关于使用实现IDisposable的对象的评论有什么意义呢?跨度>
  • 这是前两点的结果。如果 A=>B 且 C=>A 则 !B=>!C。对不起,我把你弄糊涂了。我的大脑有时会这样工作。
【解决方案2】:

这取决于您实施的是什么。一个Database对象,它是一个与数据库的连接,你不想每次在数据库中执行sql语句时都释放连接,因为性能会很糟糕。

如果您正在实施基于 Web 的解决方案,通常每个请求使用一个 Database 对象,但该请求肯定会在不同的过滤器、全局过滤器和多个控制器的方法中执行多个 sql 语句,因此您不能使用 Using

【讨论】:

    【解决方案3】:

    作为一个简单的规则:如果一个类实现了 IDisposable 则继续并将其包装在 using 中。他们可能实际上并没有使用任何非托管资源,但它不会受到伤害,并且可能会在未来证明您不会发生变化。

    【讨论】:

    • 不能再同意了!然而,一些 API 使用 dispose 来处理 synax 糖,当以这种方式使用时,应该有很好的文档记录。我要为 PetaPoco 添加一个注释。
    【解决方案4】:

    这里是 PetaPoco 维护者。 Dispose 与调用CloseSharedConnection() 相同。但是,c# 语法仅支持 using(...) 和 IDisposable。比如IDBConnection,根据记忆,支持CloseDispose

    基本上,归根结底是选择

    示例 1

    using(var db = new PetaPoco()) 
    {
        // some code
    }
    

    示例 2

    var db = new PetaPoco()
    
    try 
    {
        // code
    }
    finally 
    {
        db.CloseSharedConnection();
    }
    

    【讨论】:

      【解决方案5】:

      GC 调用Object.FinalizeIDisposable 不是 GC 调用的,必须手动调用。 GC与usingIDisposable无关

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-04
        • 2012-01-19
        • 2012-04-28
        • 2015-11-13
        • 2011-01-17
        • 1970-01-01
        • 2016-02-13
        • 2016-01-21
        相关资源
        最近更新 更多