4

using语句自动执行IDisposable中包含的Dispose方法,数据库相关类(如SqlConnection、SqlCommand等)实现该接口。

所以如果我要使用这种类,我应该使用一个using语句来创建对象,以便在操作结束时释放资源吗?

例如,出于某种原因,我需要使用 SqlConnection、SqlCommand、SqlDataAdapter 和 DataTable,所以我在下面编写了这段代码,这是最好的方法还是应该将 Dispose() 放在 try 的 finally 子句中。 .. 抓住... 最后?

using (SqlConnection con = new SqlConnection(Properties.Settings.Default.ConnectionString))
using (SqlCommand cmd = new SqlCommand())
using (SqlDataAdapter da = new SqlDataAdapter())
using (DataTable dt = new DataTable())
{
    // Do something...
}
4

3 回答 3

6

你拥有它的方式是正确的。Dispose() 方法将自动调用 Close()。对于实现 IDisposable 的所有东西来说,这不一定是正确的,但对于与 DB 相关的类,它是正确的。

于 2013-06-15T13:25:32.533 回答
3

要完成克里斯的回答:

如果您采用try/finally方式,则必须检查所有实例是否不为空:

try
{
    SqlConnection con = new SqlConnection(Properties.Settings.Default.ConnectionString);
    ...
}
finally
{
    if (con != null) con.Dispose();
    if (cmd != null) cmd...
}

using 语句正是为了简化这种用例。

顺便说一句,它可以做更多很酷的事情: http: //pragmateek.com/c-scope-your-global-state-changes-with-idisposable-and-the-using-statement/

于 2013-06-15T13:37:18.480 回答
2

Chris 的回答是正确的,但请注意,当前的一些数据库实现实际上并没有在他们的Dispose调用中做太多事情。

这可能意味着“差”但简单的代码,例如返回DataTable本身,实际上可能与“正确”的代码资源使用方式没有太大区别。

但是因为这些类已经实现了IDisposable应该总是使用Using,以防它们的实现在未来发生变化以实际处理某些东西。

于 2013-06-15T13:39:21.613 回答