我是否需要显式处置SqlDataAdapter?

在这个线程中 ,有一个建议是在操作之后, 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怎么样?

强烈建议手动配置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将确保首先调用对象的终结器,然后收集它。 您可以在Finalizer中调用Dispose,这有一个很好的模式,称为“Dispose Method”: http : //msdn.microsoft.com/en-us/library/fs2xkftw.aspx

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

从代码示例中包含MSDN的SrtDataAdapter 类的 ACrticle

 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语句中声明并实例化它。

通常……是的,你这样做。
在某些情况下,当不需要调用Dispose时,但这些情况基于实现细节,不应被视为一般方法。

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

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

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

 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(); }** 

一旦你到达块的末尾,使用将为你处理它。