Dot-Net-2.0

使用 yield 遍歷數據讀取器可能不會關閉連接?

  • November 15, 2019

這是一個範常式式碼,用於使用我在Google搜尋時在幾個地方找到的 yield 關鍵字從數據庫中檢索數據:

public IEnumerable<object> ExecuteSelect(string commandText)
{
   using (IDbConnection connection = CreateConnection())
   {
       using (IDbCommand cmd = CreateCommand(commandText, connection))
       {
            connection.Open();
            using (IDbDataReader reader = cmd.ExecuteReader())
            {
               while(reader.Read())
               {
                   yield return reader["SomeField"];
               }
            }
            connection.Close();
       }
   }
}

我是否認為在這個範常式式碼中,如果我們不遍歷整個數據讀取器,連接就不會關閉?

如果我理解正確,這是一個不會關閉連接的範例。

foreach(object obj in ExecuteSelect(commandText))
{
 break;
}

對於可能不是災難性的數據庫連接,我想 GC 最終會清理它,但是如果它不是連接而是更關鍵的資源怎麼辦?

編譯器合成的 Iterator 實現IDisposable,在循環退出foreach時呼叫。foreach

Iterator 的方法將在提前退出Dispose()時清理語句。using

只要你在foreach循環、塊中使用迭代器,或者以其他方式using()呼叫方法,迭代器的清理就會發生。Dispose()

連接將自動關閉,因為您在“使用”塊中使用它。

引用自:https://stackoverflow.com/questions/47521