Gibt es einen richtigen Weg, um von einem foreach zu brechen, so dass die IEnumerable<> weiß, dass ich fertig bin und es aufräumen sollte.
Betrachten Sie den folgenden Code:
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();
}
}
}
Wenn der Verbraucher die foreach-Schleife nicht verlässt, ist alles in Ordnung und der Leser gibt false zurück, die while-Schleife wird beendet und die Funktion bereinigt den Datenbankbefehl und die Verbindung. Aber was passiert, wenn der Aufrufer die foreach-Schleife abbricht, bevor ich fertig bin?