C#.NET使用块

C#.NET使用块,c#,using-statement,C#,Using Statement,我想在DAL层中使用“using”块。像 using (SqlConnection con = new SqlConnection("connection string")) { Command object Reader object } 由于中的SqlConnection对象在using块中初始化,我知道当控件退出using块作用域时,该连接对象将被自动处理 但我正在使用块内部创建命令和读取器对象。我必须显式关闭它们还是必须为它们编写另一个“使用”块。您可以为实现IDi

我想在DAL层中使用“using”块。像

using (SqlConnection con = new SqlConnection("connection string"))
{
     Command object
     Reader object
}
由于中的SqlConnection对象在using块中初始化,我知道当控件退出using块作用域时,该连接对象将被自动处理


但我正在使用块内部创建命令和读取器对象。我必须显式关闭它们还是必须为它们编写另一个“使用”块。

您可以为实现
IDispose
的任何项目使用
块。因此,您可以在用于连接的块内,使用
块为其中的每一个创建嵌套的
,以确保它们在使用后得到正确处理。

您也应该将
使用
用于命令和读卡器,或者显式关闭它们

我通常是这样编码的:

var sql = "SELECT * FROM table";
using (var cn = new SqlConnection(connectionString))
using (var cmd = new SqlCommand(sql, cn)) {
}

这限制了标识的数量。

您通常也使用块来编写标识,即

using (SqlConnection con = new SqlConnection("connection string"))
{
    con.Open();
    using (SqlCommand cmd = con.CreateCommand())
    {
        cmd.CommandText = "select * from table";
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            ...
        }
    }
}

值得为任何支持IDisposable接口的代码编写一个using块。通过这种方式,您可以确保您已经尽了最大努力来释放任何稀缺资源。

如果您不喜欢为您的连接和读卡器使用
using()
finally
块。对于读卡器,在读卡器关闭之前,连接不会关闭。我还读到,
using()
并不能100%保证连接会关闭,但我不知道这背后的原因,因为它被转换为try-finally块,并将在任何情况下执行。

不确定。但不需要再编写一个“using”块。在块作用域覆盖对象之后:命令和读取器将被释放。@Pratik,只有使用(…)显式放入
中的对象实际被释放。
括号。这里,将不处理命令和读取器。