我想重构我的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..
}
与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) )
{
...
}
}
对我来说,我更喜欢使用第二种解决方案,它更加微妙,或者您可以使用下面的示例:
using (var sqlConnection = new SqlConnection(connection))
{
using (var command = new SqlCommand(query, sqlConnection))
{
using (var read = command.ExecuteReader())
{
// process on your read
}
}
}