Вот пример кода для извлечения данных из базы данных с использованием ключевого слова 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();
}
}
}
Правильно ли я считаю, что в этом примере кода соединение не будет закрыто, если мы не проведем итерацию по всему устройству чтения данных?
Вот пример, который не закрыл бы соединение, если я правильно понимаю yield ..
foreach(object obj in ExecuteSelect(commandText))
{
break;
}
Для соединения БД, которое может быть не катастрофическим, я полагаю, что GC в конечном итоге очистит его, но что, если вместо соединения это более критичный ресурс?