在this thread中,有人建议在操作之后, 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怎么样?
答案 0 :(得分:9)
强烈建议手动配置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。
答案 1 :(得分:5)
从代码示例中包含SqlDataAdapter Class
的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 statement中。来自那篇链接的文章:
通常,当您使用IDisposable对象时,您应该声明和 在using语句中实例化它。
答案 2 :(得分:2)
通常......是的,你这样做
在某些情况下,当不需要调用Dispose
时,这些情况基于实现细节,不应被视为一般方法。
一次性不是垃圾收集。这是关于确定性资源清理。 这些东西是平行的宇宙。
GC可以收集对象,该对象在不调用IDisposable
的情况下实现Dispose
。但是,如果该对象拥有OS句柄,例如,您有两种方法:立即释放句柄(调用Dispose
),或等待终结器(但是当终结器运行时,只知道GC)。
当你的资源被管理时,事情就更糟了
不应在终结器中释放托管资源。因此,所有资源清理都是Dispose
方法的责任。如果您不调用Dispose
,则永远不会清理托管资源(最常见的示例是事件取消订阅),这会导致内存泄漏。
答案 3 :(得分: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();
}**
一旦你到达街区尽头,使用将把它丢弃。