PetaPoco.Database 实现了 IDisposable,那么为啥大多数示例没有“使用”语句呢?
Posted
技术标签:
【中文标题】PetaPoco.Database 实现了 IDisposable,那么为啥大多数示例没有“使用”语句呢?【英文标题】: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 我认为您比他们更了解逻辑。他们不是神。
【参考方案1】:
IDisposable
告诉 GC
当它想要摆脱 object
时该怎么做。using
要求 GC
在其范围结束时摆脱 object
。
将using
与不是IDisposable
的object
一起使用是没用的。
【讨论】:
但 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
,根据记忆,支持Close
和Dispose
。
基本上,归根结底是选择
示例 1
using(var db = new PetaPoco())
// some code
示例 2
var db = new PetaPoco()
try
// code
finally
db.CloseSharedConnection();
【讨论】:
【参考方案5】:GC 调用Object.Finalize
。
IDisposable
不是 GC 调用的,必须手动调用。 GC与using
和IDisposable
无关
【讨论】:
以上是关于PetaPoco.Database 实现了 IDisposable,那么为啥大多数示例没有“使用”语句呢?的主要内容,如果未能解决你的问题,请参考以下文章
R新旧模型计算净重新分类指数(NRI)和整体鉴别指数(IDI)详解及实战
R语言临床预测模型的评价指标与验证指标实战:综合判别改善指数IDI(Integrated Discrimination Improvement, IDI)
在vc++6.0MFC中如何添加Icon的ID为IDI_CALENDAR,IDI_COMPOSE图片资源?
R语言临床预测模型的评价指标与验证指标实战:自定义的综合判别改善指标(Integrated Discrimination Improvement, IDI)函数