我理解在从您的应用程序连接到 sql server 时使用 using
块的概念,因为它会在超出范围时立即关闭连接并节省我们编写 try catch finally
块的时间。
但我的问题是,在初始化 using
时使用 SqlCommand
是否有任何好处,我通常会执行以下操作:
string cs = ConfigurationManager.ConnectionStrings["CS1"].ConnectionString;
using(SqlConnection con = new SqlConnection(cs))
{
SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.City", con);
con.Open();
DropDownList1.DataSource = cmd.ExecuteReader();
DropDownList1.DataTextField = "City";
DropDownList1.DataValueField = "ID";
DropDownList1.DataBind();
}
但是通过将 SqlCommand 初始化放在 using
block
中我可以获得什么可能的好处?string cs = ConfigurationManager.ConnectionStrings["CS1"].ConnectionString;
using(SqlConnection con = new SqlConnection(cs))
{
using(SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.City", con))
{
con.Open();
DropDownList1.DataSource = cmd.ExecuteReader();
DropDownList1.DataTextField = "City";
DropDownList1.DataValueField = "ID";
DropDownList1.DataBind();
}
}
我在网上搜索的所有 Material 都谈到一旦超出范围就关闭连接,是的,我明白这一点,但是将 SqlCommand 放入 using 块是否会使其更有效率?
非常感谢您的任何建议或指示。
最佳答案
在查看源代码时,您可以清楚地看到这一点。
这是 SqlCommand.Dispose
的实现:
override protected void Dispose(bool disposing)
{
if (disposing)
{
_cachedMetaData = null;
}
base.Dispose(disposing);
}
如您所见,这并没有多大作用。但是,当查看
base.Dispose
时:public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
SqlCommand
继承自 DbCommand
,而后者又继承自 Component
。 Component
实现了一个 finalizer ,这意味着一旦没有人引用该对象,它就不会被释放,因为它仍然有对 finalizer queue 的引用。当你用
SqlCommand
语句包装 using
时,它最重要的部分是它的基类(组件)调用 GC.SupressFinialize
,它删除了对终结器队列的引用,并让对象在 GC 启动时被收集。这就是为什么
SqlCommand
实现 IDisposable
,并且应该被处置。关于c# - "using"块对 SqlCommand 初始化的好处,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27677808/