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() ?

while (reader.Read())自动关闭自己

调用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();
    }
}

您可以调用CloseDispose,但始终使用using方法,以避免在调用CloseDispose之前抛出异常时留下一次性对象未处置

更新…

正如一些评论者所说,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