Удаление перечислителя, когда он не использует, foreach или вручную вызывает Dispose ()
м используюyield return
перебиратьSqlDataReader
записи: я
IEnumerable GetReadings() {
using (var connection = new SqlConnection(_connectionString))
{
using (var command = new SqlCommand(_query, connection))
{
connection.Open();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
yield return new Reading
{
End = reader.GetDateTime(0),
Value = reader.GetDouble(1)
};
}
}
connection.Close();
}
}
}
м, используя адаптированную версиюэтот принятый ответ к "застежка-молния» много итераторов вместе:
var enumerators = data.Select(d => new
{
d.Key,
Enumerator = d.Value.GetEnumerator()
}).ToList();
while (true)
{
foreach (var item in enumerators)
{
if (!item.Enumerator.MoveNext())
{
yield break;
}
/*snip*/
}
/*snip*/
}
В методе выше перечислительDispose()
явно не вызывается, и потому что они не используются вusing
или жеforeach
Скажите, будет ли основной итератор оставаться в открытом состоянии? В моем случае с открытым.SqlConnection
Должен ли я звонитьDispose()
на счетчиках, чтобы убедиться, что вся цепочка вниз по течению замкнута?