如果我在using
块中实例化SqlDataReader,我是否需要在阅读器上调用close()
?
查找下面显示的用户的简单示例。
using (var connection = new SqlConnection(Settings.GetValue("SqlConnection")))
{
SqlCommand command = new SqlCommand("select * from Users where Id = @Id", connection);
command.Parameters.Add("@Id", SqlDbType.UniqueIdentifier);
command.Parameters["@Id"].Value = id;
using (SqlDataReader reader = command.ExecuteReaderWithRetry())
{
reader.Read();
if (reader.HasRows)
{
//Do work
}
//Is this neccesary?
reader.Close();
}
}
答案 0 :(得分:12)
如果它在使用块中,则会自动关闭。您无需显式关闭它。
BTW你的例子中的SqlCommand是一次性的。您也应该在using块中创建它,否则它控制的任何资源都不会被释放,直到垃圾收集器收集。
你的不熟练的SqlCommand实际上是一个很好的例子,说明为什么C#的RAII仿真不是“真正的”RAII。你必须为RAII采取明确的行动(制作块),这相当于一个明确的关闭,虽然语法不同。