C#.NET的使用块

3

我想在我的DAL层中使用"using"块。例如:

using (SqlConnection con = new SqlConnection("connection string"))
{
     Command object
     Reader object
}

由于SqlConnection对象在using块中初始化,我知道当控件退出using块作用域时,该连接对象将自动处理。

但是,我正在使用块内创建Command和Reader对象。 我是否必须显式关闭它们或者必须为它们编写另一个“using”块。


不确定。但是不需要编写另一个“using”块。在块作用域结束后,对象:Command和Reader将被处理。 - Pratik
@Pratik,只有明确放置在“using(...)”括号中的对象才会被处理。在这里,Command和Reader将不会被处理。 - Lucero
5个回答

4

您应该对命令和读取器也使用using,或者显式地关闭它们。

我通常会像这样编写代码:

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

这可以限制缩进次数。

3
你通常也会使用using块来编写它们,即:
using (SqlConnection con = new SqlConnection("connection string"))
{
    con.Open();
    using (SqlCommand cmd = con.CreateCommand())
    {
        cmd.CommandText = "select * from table";
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            ...
        }
    }
}

2

对于支持IDisposable接口的任何代码,编写using块都是值得的。这样可以确保您已尽力释放任何稀缺资源。


1

您可以为任何实现了IDispose接口的项创建using块。因此,您可以在连接块内为每个这样的项创建嵌套的using块,以确保它们在使用后被正确处理。


0

如果您不喜欢使用for循环来处理连接和读取器,那么您应该使用using()finally块。对于读取器,只有在读取器关闭时连接才会关闭。此外,我已经阅读过using()并不能100%保证连接将被关闭,但我不知道原因,因为它会转换为try-finally块,并且将在任何情况下执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接