繁体   English   中英

while(reader.Read())会自动关闭吗?

[英]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()

调用reader.Read()在读完所有数据之后会自行关闭吗?

不, Read()方法只是将光标移动到下一行。 默认位置第一个记录之前 这就是为什么你必须使用这种方法来读取阅读器中的任何数据。

我还应该打电话给读者。关闭();

是的,但不是这样,使用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
    }
}

...调用IDisposable.Dispose如果using语句中的赋值对象是一个IDisposableusing块结束时(如果它不是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
    }
}

因为读者将在退出使用后被处理并将被关闭。

不,它不会关闭您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM