应该使用"使用"声明?

时间:2015-03-11 01:11:14

标签: c# dapper micro-orm

我见过有人在做的例子:

IDbConnection db = new MySqlConnection(conn);

var people = db.Query<People>("SELECT * FROM PEOPLE").ToList();

或者上面是一种不好的做法,并且所有查询都应该使用如下语句:

using (var db = new MySqlConnection(conn))
{
var people = db.Query<People>("SELECT * FROM PEOPLE").ToList();
}

4 个答案:

答案 0 :(得分:11)

正如其他人已经正确指出的那样,一般的最佳做法是在对象实现using的任何时候使用IDisposable并且您知道对象的生命周期将会很短 - 这是,不超过当前方法的持续时间。这样做可确保及时清理稀缺的操作系统资源。即使对象的处理是&#34;支持&#34;通过它的终结器,您不希望处于这样的情况,例如,您对文件或数据库有锁定,或者在终结器从现在开始运行数十亿纳秒之后才会发布。

但是,我会通过说除了及时处理非托管资源之外的其他原因而实施IDisposable的少数类型,从而缓和了这一建议。在某些非常具体的案例中,您可以安全地跳过using。但是,使用using几乎不会错误,即使严格说来是必要,所以我对你的建议是错误的谨慎和过度使用,而不是使用不足using

答案 1 :(得分:7)

Dapper对此没有看法;你在using这里是数据库连接。如果您已完成连接:您已完成连接。基本上,是的,您应该使用using

答案 2 :(得分:2)

使用语句的主要目的是释放非托管资源。当不再使用对象时垃圾收集器会自动释放分配给它的内存但有时垃圾收集器不会释放文件,流或数据库连接等资源就像你的例子一样。

把它想象成一种显式处理对象的方法,而不是让它留给编译器,这样你就可以说它是更好的做法。

答案 3 :(得分:0)

根据我使用Sql Server和Oracle的经验(使用ODP.Net驱动程序和MS驱动程序),您需要使用连接,命令和事务,否则如果您做了最简单的事情,您很快就会耗尽连接池生产环境中的数据库交互(连接池通常为~50 - 200个连接)。

您可能不会注意到开发环境中的行为,因为debug =大量重启,这会清除池。

正如Eric Lippert上面所说,使用IDisposable对象是一般的好习惯。

在实践中,您可以跳过&#34;使用&#34; on SqlServer和Oracle的参数。