我理解在从您的应用程序连接到 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 ,而后者又继承自 ComponentComponent 实现了一个 finalizer ,这意味着一旦没有人引用该对象,它就不会被释放,因为它仍然有对 finalizer queue 的引用。

当你用 SqlCommand 语句包装 using 时,它​​最重要的部分是它的基类(组件)调用 GC.SupressFinialize ,它删除了对终结器队列的引用,并让对象在 GC 启动时被收集。

这就是为什么 SqlCommand 实现 IDisposable ,并且应该被处置。

关于c# - "using"块对 SqlCommand 初始化的好处,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27677808/

10-12 22:21