如果我没记错的话,当我在里面使用yield时using SqlConnection
阻止我遇到运行时异常。
using (var connection = new SqlConnection(connectionString))
{
var command = new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// Call Read before accessing data.
while (reader.Read())
{
yield reader[0];
}
// Call Close when done reading.
reader.Close();
}
当我更换后这些问题就解决了yield
通过一个列表,我在每次迭代中添加了项目。
当我在里面时,同样的问题还没有发生在我身上using StreamReader
blocks
using (var streamReader = new StreamReader(fileName))
{
string line;
while ((line = streamReader.ReadLine()) != null)
{
yield return line;
}
}
有什么解释为什么异常发生在前一种情况而不是后者?这样的施工是否可取?
EDIT要获得我过去所做的错误(早期处理),您应该调用下面的第一个方法:
IEnumerable<string> Read(string fileName)
{
using (var streamReader = new StreamReader(fileName))
{
return Read(streamReader);
} // Dispose will be executed before ReadLine() because of deffered execution
}
IEnumerable<string> Read(StreamReader streamReader)
{
string line;
while ((line = streamReader.ReadLine()) != null)
{
yield return line;
}
}
使用其他延迟执行的方法也可以实现相同的错误,例如System.Linq.Enumerable.Select()