2

我对 C# 还比较陌生,并且仅在过去几天内接触过“IDisposables”。我可以掌握using块的概念来处理必须处理的对象,而无需手动记住调用该.Dispose()方法 - 方便!

假设我从一个新的开始SqlConnection,我在一个using语句中处理它。在该代码块中,我创建了一些额外的 IDisposable,例如SqlDataAdapter. 该适配器是否需要它自己的using声明?

例如,如果我有代码...

using (SqlConnection myConnection = new SqlConnection())
{
    SqlCommand myCommand = new SqlCommand();
    SqlDataAdapter myAdapter = new SqlDataAdapter();
    // Do things
}

... 将在何时被myCommand处置(因为它们在该代码块的范围内)?或者我需要多个语句,也许是这样的:myAdaptermyConnectionusing

using (SqlConnection myConnection = new SqlConnection())
{
    using (SqlCommand myCommand = new SqlCommand())
    {
        using (SqlDataAdapter myAdapter = new SqlDataAdapter())
        {
            // Do things
        }
    }
}
4

3 回答 3

7

严格来说,确实最好把它们全部处理掉。但是,您可以通过直接嵌套它们来避免缩进:

using (var myConnection = new SqlConnection())
using (var myCommand = new SqlCommand())
using (var myAdapter = new SqlDataAdapter())
{
    // Do things
}

或者,特别是在 ADO.NET 的情况下(公平地说,它有很多一次性类型),您可能会发现使用隐藏大量管道的库之一更容易 - 例如,使用“小巧玲珑”:

using(var conn = new SqlConnection(...))
{
    return conn.Query<Customer>(
        "select * from Customers where Region=@region",
        new { region }).ToList();
}
于 2013-09-28T14:43:37.533 回答
3

该适配器是否需要它自己的 using 语句?

在这种情况下,没有。但这取决于对 Connection 和 Adapter 对象的详细了解,因此最好的做法是:使用using()每个IDisposable. 即使对于 MemoryStreamDispose()什么都不做。它们很便宜。

您的代码是正确的,但我们通常会节省{}

using (SqlConnection myConnection = new SqlConnection())
using (SqlCommand myCommand = new SqlCommand())    
using (SqlDataAdapter myAdapter = new SqlDataAdapter())
{
    // Do things
}

我们在这里使用的规则是,当using()控制 1 语句(下一个using())时,您不需要大括号。然后我们稍微修改一下缩进。

于 2013-09-28T14:42:35.480 回答
0

使用只是合成糖

            var connection = new Connection();
        try
        {
            connection.DoSomething();
        }
        finally
        {
            // Check for a null resource.
            if (connection != null)
            {
                ((IDisposable)connection).Dispose();
            }
        }

所以是的,您需要嵌套 using 语句以确保处理所有这些

于 2013-09-28T14:43:08.010 回答