我是否需要显式处置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(); }**
一旦你到达块的末尾,使用将为你处理它。
上述就是C#学习教程:我是否需要显式处置SqlDataAdapter?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1023284.html