これは、グーグル検索中にいくつかの場所で見つけた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();
}
}
}
このサンプル コードでは、 datareader 全体を繰り返し処理しないと接続が閉じられないと考えてよろしいですか?
収量を正しく理解していれば、接続を閉じない例を次に示します。
foreach(object obj in ExecuteSelect(commandText))
{
break;
}
壊滅的ではない可能性のあるデータベース接続の場合、GC は最終的にそれをクリーンアップすると思いますが、接続ではなく、より重要なリソースである場合はどうなるでしょうか?