Dot-Net-2.0
使用 yield 遍歷數據讀取器可能不會關閉連接?
這是一個範常式式碼,用於使用我在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時呼叫。foreachIterator 的方法將在提前退出
Dispose()時清理語句。using只要你在
foreach循環、塊中使用迭代器,或者以其他方式using()呼叫方法,迭代器的清理就會發生。Dispose()
連接將自動關閉,因為您在“使用”塊中使用它。