C# 我需要显式地处理SqlDataAdapter吗?

C# 我需要显式地处理SqlDataAdapter吗?,c#,database-connection,C#,Database Connection,在中,有一个建议是,在操作之后,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的实例被显式地这样处理

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呢?

来自MSDN文章中的代码示例:

使用语句将
SqlConnection
包装在
中,但不使用
SqlDataAdapter

所以我想说这不是必须的

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

在这种情况下,您还可以将SqlDataAdapter包装在一个容器中。从该链接文章中:

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


使用将在到达块的末尾后为您处理它。

通常。。。是的,你知道。
有些情况下,不需要调用
Dispose
,但这些情况基于实现细节,不应视为一般方法

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

GC可以收集对象,该对象实现了
IDisposable
,而无需调用
Dispose
。但是,例如,如果该对象持有操作系统句柄,则有两种方法:要么立即释放句柄(调用
Dispose
),要么等待终结器(但当终结器运行时,只知道GC)

当您的资源得到管理时,情况会更糟。

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

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

using SqlConnection con = new SqlConnection(connstring);
using SqlCommand com = new SqlCommand();
using SqlDataAdapter da = new SqlDataAdapter();
com.Connection = con;
//etc..
通过这种方式,编译器将确保在使用创建的所有对象超出范围后调用Dispose()(它使用try..finally来实现这一点)

GC不负责对对象调用Dispose(),它的主要职责是从不再被引用的堆中收集对象。一个例外是,如果您的类是可终结的。在这种情况下,GC将确保首先调用对象的终结器,然后收集它。您可以在终结器中调用Dispose(),这个名为“Dispose方法”的模式很好:


但一般规则是(有几个例外):如果您正在实例化一个实现IDisposable的对象,那么您有责任对其调用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();
}**
using SqlConnection con = new SqlConnection(connstring);
using SqlCommand com = new SqlCommand();
using SqlDataAdapter da = new SqlDataAdapter();
com.Connection = con;
//etc..