【发布时间】:2014-02-15 17:20:42
【问题描述】:
我正在使用yield return 迭代SqlDataReader 的记录:
IEnumerable<Reading> 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();
}
}
}
然后我使用 this accepted answer 的改编版本将许多迭代器“压缩”在一起:
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() 以确保整个下游链都已关闭?
【问题讨论】:
-
为什么不使用
using语法?它在块上下文结束时自动调用,包括yield和return。 -
在 zipmany 样式方法中具有可变数量的枚举器使得很难用
using包装每个枚举器。
标签: c# enumeration enumerator yield-return