while (reader.Read())自动关闭自己
本文关键字:自己 Read while reader | 更新日期: 2023-09-27 17:52:46
通常当我用c#编码时,我要么用两种方式之一来写我的SqlDataReader
:
reader.Read();
if (reader.HasRows)
{
// Code here
}
reader.Close();
或:
while (reader.Read())
{
// Code here
}
在第一个实例中,我打开SqlDataReader
并关闭它。第二个我在while循环中被称为reader.Read()
。
我的问题是:调用reader.Read()
在读取所有数据后关闭自己吗?还是应该调用reader.Close()
?
调用reader.Read()在读取所有数据后关闭自己吗?
。Read()
方法只是将光标移动到下一行。默认位置是在第一条记录之前。这就是为什么必须使用此方法读取阅读器中的任何数据。
是否应该调用reader。close ();
是,但不是那样,使用using
语句来自动处置您的SqlDataReader
。
using(var reader = command.ExecuteReader())
{
while (reader.Read())
{
// Code here
}
} <-- your reader will be disposed here.
或者:
using(SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// Code here
}
}
…当using
块结束时(如果不是IDisposable
编译器会哭!),using语句中调用IDisposable.Dispose
(如果赋值对象)是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
}
}
,因为reader退出使用后将被处理,并且将被关闭。
不,它不会关闭你的dataReader。当你处理对象时,是的,它会关闭。由于您的类型实现了IDisposable
,因此最好使用using
关键字。
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
// ....
}
}
是的,您需要关闭连接。
SqlDataReader是可丢弃的,所以最安全的使用方法是在using语句中使用它:
using (SqlDataReader reader = GetSqlDataReader())
{
while (reader.Read())
{
// Code here
}
}
不,它没有。SqlDataReader实现了IDisposable来释放非托管资源——最简单的编码方法是将阅读器的使用封装在using块中:
using (var reader = getYourReader())
{
while (reader.Read())
{
// work is done here
}
} // leaving the using block reader.Dispose() will be called automatically