Есть ли способ переломать из foreach таким образом, что IEnumerable < > знает, что я сделан, и он должен очищаться.
Рассмотрим следующий код:
private static IEnumerable<Person> getPeople()
{
using (SqlConnection sqlConnection = new SqlConnection("..."))
{
try
{
sqlConnection.Open();
using (SqlCommand sqlCommand = new SqlCommand("select id, firstName, lastName from people", sqlConnection))
{
using (SqlDataReader reader = sqlCommand.ExecuteReader())
{
while (reader.Read())
yield return new Person(reader.GetGuid(0), reader.GetString(1), reader.GetString(2));
}
}
}
finally
{
Console.WriteLine("finally disposing of the connection");
if (sqlConnection.State == System.Data.ConnectionState.Open)
sqlConnection.Close();
}
}
}
Если потребитель не отрывается от foreach, то все в порядке, и читатель вернет false, цикл while willend и функция очистит команду и соединение с базой данных. Но что произойдет, если вызывающий абонент перейдет из файла foreach, прежде чем я закончу?