9

这个线程中,有一个建议是,在操作之后,SqlDataAdapter的实例会像这样显式地处理掉。

String connString = @"your connection string here";
String query = "select * from table";

SqlConnection conn = new SqlConnection(connString);        
SqlCommand cmd = new SqlCommand(query, conn);
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dataTable);
conn.Close();
da.Dispose();

真的有必要吗?GC呢?

4

4 回答 4

10

强烈建议手动处理 IDisposable 对象。有一个很好的语法快捷方式:

using SqlConnection con = new SqlConnection(connstring);
using SqlCommand com = new SqlCommand();
using SqlDataAdapter da = new SqlDataAdapter();
com.Connection = con;
//etc..

这样,编译器将确保在所有使用 using 创建的对象超出范围后调用 Dispose()(它使用 try..finally 来实现这一点)。

GC 不负责在你的对象上调用 Dispose(),它的主要职责是从堆中收集不再被引用的对象。一个例外是,如果你的类是 Finalizable。在这种情况下,GC 将确保首先调用对象的终结器,然后将其收集。您可以在终结器中调用 Dispose(),并且有一个很好的模式,称为“Dispose 方法”:http: //msdn.microsoft.com/en-us/library/fs2xkftw.aspx

但一般规则是(有几个例外):如果您正在实例化一个实现 IDisposable 的对象,则您有责任在其上调用 Dispose。

于 2013-08-13T09:58:20.893 回答
5

SqlDataAdapter 类的 MSDN 文章中的代码示例:

private static DataSet SelectRows(DataSet dataset, string connectionString,string queryString) 
{
    using (SqlConnection connection = 
        new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand(
            queryString, connection);
        adapter.Fill(dataset);
        return dataset;
    }
}

SqlConnection包裹在一个using语句中,但不是SqlDataAdapter.

所以我会说这不是必需的。

也就是说,有些人倾向于如果它实现了 IDisposable,则处理它

在这种情况下,您还可以将 SqlDataAdapter 包装在using 语句中。从那个链接的文章:

通常,当您使用 IDisposable 对象时,您应该在 using 语句中声明和实例化它。

于 2013-08-13T09:45:08.053 回答
2

作为一项规则......是的,你这样做。
在某些情况下,Dispose不需要调用,但这些情况基于实现细节,不应被视为一般方法。

Disposable 与垃圾收集无关。它是关于确定性资源清理的。这些东西是平行宇宙。

GC 可以收集对象,IDisposable无需调用Dispose. 但是,如果该对象拥有操作系统句柄,例如,您有两种方法:立即释放句柄(调用Dispose),或等待终结器(但终结器何时运行,只知道 GC)。

当您的资源得到管理时,情况会更糟。
托管资源不应在终结器中释放。因此,所有资源清理都是Dispose方法的责任。如果你不调用Dispose,托管资源将永远不会被清理(最流行的示例是事件取消订阅),这会给你带来内存泄漏。

于 2013-08-13T09:47:58.580 回答
1
String connString = @"your connection string here";
String query = "select * from table";

SqlConnection conn = new SqlConnection(connString);        
SqlCommand cmd = new SqlCommand(query, conn);
conn.Open();
**Using(SqlDataAdapter da = new SqlDataAdapter(cmd))
{
    da.Fill(dataTable);
    conn.Close();
}**

一旦你到达街区的尽头,Using 就会为你处理掉它。

于 2013-08-13T09:47:09.387 回答