这是一个示例代码,用于使用我在谷歌搜索时在几个地方找到的 yield 关键字从数据库中检索数据:
public IEnumerable<object> ExecuteSelect(string commandText)
{
using (IDbConnection connection = CreateConnection())
{
using (IDbCommand cmd = CreateCommand(commandText, connection))
{
connection.Open();
using (IDbDataReader reader = cmd.ExecuteReader())
{
while(reader.Read())
{
yield return reader["SomeField"];
}
}
connection.Close();
}
}
}
我是否认为在这个示例代码中,如果我们不遍历整个数据读取器,连接就不会关闭?
如果我理解正确,这是一个不会关闭连接的示例。
foreach(object obj in ExecuteSelect(commandText))
{
break;
}
对于可能不是灾难性的数据库连接,我想 GC 最终会清理它,但是如果它不是连接而是更关键的资源怎么办?