我是否仍然会获得Dispose先锋,如果我在使用中,用null初始化?

问题描述 投票:-2回答:2

我想重构我的SqlDataReader代码,所以它使用using ..

SqlDataReader reader = null;
reader = xdCmd.ExecuteReader();
// use reader..

我可以使用解决方案1)我在使用中声明reader,然后先用SqlDataReader初始化它,仍然使用提供的Dispose“功能”?或者我是否需要像在解决方案2)中那样进行,在using中,初始化会立即发生?我猜想1)很好,但我不确定。

1)

using (SqlDataReader reader = null)
{
    xdCmd.CommandText = $"select * from {tableName}";
    reader = xdCmd.ExecuteReader();
    // use reader..
}

2)

using (SqlDataReader reader = new SqlDataReader(new SqlCommand($"select * from {tableName}"), xdCon))
{
    reader = xdCmd.ExecuteReader();
    // use reader..
}
c# dispose using-statement
2个回答
3
投票

与Rust不同,C#语言不包含表达对象“所有权”或生命周期管理概念的语法,所以完全取决于API的文档来说明对象的构造函数是否取得其参数的所有权(因此可以调用.Dispose())。这不是C#编译器可以为您确定的。但是.Dispose()实现无论如何都必须是幂等的,因此调用.Dispose()多次(冗余)时间没有任何害处。

只需遵循堆叠的using语句的C#惯用约定:

using( SqlConnection c = new SqlConnection( connectionString ) )
using( SqlCommand cmd = c.CreateCommand() )
{
    await c.OpenAsync().ConfigureAwait(false);

    cmd.CommandText = "SELECT foo, bar FROM baz";

    using( SqlDataReader rdr = await cmd.ExecuteReaderAsync().ConfigureAwait(false) )
    {
        ...
    }
} 

0
投票

对我来说,我更喜欢使用第二种解决方案,它更加微妙,或者您可以使用下面的示例:

using (var sqlConnection = new SqlConnection(connection))
{
       using (var command = new SqlCommand(query, sqlConnection))
       {
            using (var read = command.ExecuteReader())
            {
                // process on your read
            }
       }
}
© www.soinside.com 2019 - 2024. All rights reserved.