[英]Does while (reader.Read()) automatically close itself?
通常当我在C#编码时,我或者用两种方式之一编写我的SqlDataReader
:
reader.Read();
if (reader.HasRows)
{
// Code here
}
reader.Close();
要么:
while (reader.Read())
{
// Code here
}
在第一个实例中,我打开SqlDataReader
并关闭它。 第二个我只是在一个while循环中调用reader.Read()
。
我的问题是:在读取所有数据后,调用reader.Read()
是否会reader.Read()
关闭? 或者我还应该打电话给reader.Close()
?
要么:
using(SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// Code here
}
}
...调用IDisposable.Dispose
如果using语句中的赋值对象是一个IDisposable
当using
块结束时(如果它不是IDisposable
编译器会哭!),这是一个语法糖:
SqlDataReader reader = cmd.ExecuteReader();
try
{
while (reader.Read())
{
// Code here
}
}
finally
{
if(reader != null)
{
reader.Dispose();
}
}
你可以调用Close
或Dispose
,但使用using
始终方法,以避免留下了一个异常之前抛出去掉的一次性对象非 Close
或Dispose
被调用。
正如一些评论者所说, using
块也是为了模糊不清,这样就不可能忘记调用Dispose
因为它是隐式调用的。
顺便说一句,这是主观的,因为谁错过了Dispose
呼叫可能不会使用using
块......从我的经验来看,仍然是一个很大的.NET开发人员谁不明白为什么一个对象实施的重要性IDisposable
。
这不仅仅是一个美观的细节:如果一个类型实现IDisposable
是因为在实例化IDisposable
类型时你必须调用Dispose
,而你不再需要它或在应用程序生命周期的特定时刻。 但无论如何, IDisposable.Dispose
调用是强制性的 。
关于这个主题我的两分钱是using
块是一种不用向无经验的.NET开发人员解释低级细节的好方法。 定义团队开发规则/指南更容易, 如果IDisposable
对象未在using
块中实例化而没有明确的理由 ,则可以声明代码审查不会通过 。
不, Read
不会关闭它,如果没有你告诉它,任何其他方法也不会这样做。 所以你必须一直关闭它。
但是,由于SqlDataReader
实现了IDisposable
,您应该将阅读器包装在using
块中:
using (SqlDataReader reader = GetReaderFromSomewhere())
{
while (reader.Read())
{
// Code here
}
}
然后您不必担心手动关闭它,并且一旦离开using
块,它将自动关闭。
不,它会一直打开,直到GC清理它,这可能会或可能不会立即发生,或者根本不会发生。
你应该选择以下的东西:
using(var reader = cmd.ExecuteReader())
{
while(reader.Read())
{
//do stuff with row
}
}
因为读者将在退出使用后被处理并将被关闭。
不,它不会关闭您的dataReader。 处理对象时,是的,它将关闭。 作为一个很好的实践,因为你的类型实现了IDisposable
,所以更喜欢使用using
关键字。
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
// ....
}
}
它将关闭读者为您隐瞒。
是的,您需要关闭连接。
SqlDataReader是IDisposable,所以如果你可以使用它是最安全的使用方法:
using (SqlDataReader reader = GetSqlDataReader())
{
while (reader.Read())
{
// Code here
}
}
不,不是的。 SqlDataReader实现IDisposable以释放非托管资源 - 最简单的编码方法是将您对reader的使用包装在using块中 :
using (var reader = getYourReader())
{
while (reader.Read())
{
// work is done here
}
} // leaving the using block reader.Dispose() will be called automatically
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.