PetaPoco.Database 实现了 IDisposable 接口,为什么大多数例子中没有 'using' 语句?

6

PetaPoco.Database对象实现了IDisposable接口,但我很少看到代码示例(包括PetaPoco 自己的网站上)包含以下using语句:

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方法什么也不做,你也不会有任何损失。 - Steve
但是如果实现了IDisposable,那么我不应该将它放在'using'块中吗?因为这通常是'using'的使用方式。 - Howiecamp
@Howiecamp 是的,你应该这样做。他们在示例中不这样做,因为当程序销毁时,GC会处理它。 - Behrooz
@Behrooz - 谢谢。但我不确定为什么如果这是最佳实践,它就不会在示例中显示出来。当AppDomain被销毁时,GC当然会始终处理所有内容,但IDisposable的整个意义在于您希望在那之前长时间释放这些资源。所以我不确定我是否理解了其中的逻辑。 - Howiecamp
@Howiecamp 我认为你比他们更好地理解了这个逻辑,他们并不是神。 - Behrooz
5个回答

3

作为一个简单的规则:如果一个类实现了IDisposable接口,那么就可以在using中使用它。他们可能并没有使用任何非托管资源,但这样做不会有坏处,反而可能会使你未来更好地应对变化。


1
完全赞同!然而,一些API使用dispose作为语法糖,当以这种方式使用时,应该有很好的文档记录。我将添加一条注释到PetaPoco中来表明这一点。 - Plebsori

2
我是PetaPoco的维护者。Dispose与调用CloseSharedConnection()相同。然而,C#语法只支持使用IDisposable。例如,从内存中获取的IDBConnection支持CloseDispose两种方法。
基本上,这取决于选择。
示例1:
using(var db = new PetaPoco()) 
{
    // some code
}

示例2

var db = new PetaPoco()

try 
{
    // code
}
finally 
{
    db.CloseSharedConnection();
}

0

GC 调用 Object.FinalizeIDisposable 不会被 GC 调用,需要手动调用。GC 与 usingIDisposable 没有任何关系。


0

这取决于你正在实现什么。数据库对象是与数据库的连接,你不想在每次执行数据库中的SQL语句时都释放连接,因为性能会非常糟糕。

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


-3

IDisposable 明确告诉 GC 在需要处理对象时该如何处理。
using 会在作用域结束时要求 GC 处理一个对象。
对于不是 IDisposable 的对象使用 using 是无效的。


但是PetaPoco.Database确实支持IDisposable。 - Howiecamp
@Howiecamp 这并不违背我之前所说的。请看我上面的另一条评论。我只是简单地陈述了三个要点。 - Behrooz
但是既然该对象确实实现了IDisposable,那么在评论中提到不使用实现IDisposable的对象时使用using有什么意义呢? - Howiecamp
这是前两个要点的结果:如果 A=>B 且 C=>A,则 !B=>!C。抱歉让你感到困惑,我的大脑有时候就是这样运作的。 - Behrooz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接