Gibt es eine ordnungsgemäße Möglichkeit, von einem Foreach so zu brechen, dass der IEnumerable <> weiß, dass ich fertig bin und es aufräumen sollte.ein Problem über die Rendite zurück und brechen von einem Foreach
Betrachten Sie den folgenden Code ein:
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 er Verbraucher von der foreach nicht bricht dann das Everthing in Ordnung ist und der Leser wird false zurück, die while-Schleife willend und die Funktion der Datenbankbefehl und Verbindung bereinigt . Aber was passiert, wenn der Anrufer aus der Foreach bricht, bevor ich fertig bin?
siehe auch http://stackoverflow.com/questions/1400146/are-there-any-pitfalls-to-using-an-ienumerablet-return-type-for-sql-data/1400195# 1400195 –