背景:データベースから取得した文字列がたくさんあるので、それらを返したいと思います。従来は、次のようになります。
public List<string> GetStuff(string connectionString)
{
List<string> categoryList = new List<string>();
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
string commandText = "GetStuff";
using (SqlCommand sqlCommand = new SqlCommand(commandText, sqlConnection))
{
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlConnection.Open();
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
while (sqlDataReader.Read())
{
categoryList.Add(sqlDataReader["myImportantColumn"].ToString());
}
}
}
return categoryList;
}
しかし、消費者はアイテムを繰り返し処理したいと考えており、他のことはあまり気にしないと思います。リスト自体にはボックスに入れないようにしたいので、IEnumerableを返すとすべてがうまくいきます。 /フレキシブル。だから私はこれを処理するために「イールドリターン」タイプのデザインを使用できると思っていました...このようなもの:
public IEnumerable<string> GetStuff(string connectionString)
{
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
string commandText = "GetStuff";
using (SqlCommand sqlCommand = new SqlCommand(commandText, sqlConnection))
{
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlConnection.Open();
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
while (sqlDataReader.Read())
{
yield return sqlDataReader["myImportantColumn"].ToString();
}
}
}
}
しかし、今私は歩留まりについてもう少し読んでいます(このようなサイトでは... msdnはこれについて言及していないようです)、それは明らかに怠惰な評価者であり、誰かが尋ねることを見越して、人口の状態を維持します次の値を取得し、次の値が返されるまで実行します。
これはほとんどの場合問題ないように見えますが、DB呼び出しでは、これは少し厄介に聞こえます。やや不自然な例として、誰かが私がDB呼び出しから入力しているIEnumerableを要求した場合、その半分を通過し、ループでスタックします...私のDB接続が進行していることがわかる限り永遠に開いたままにします。
イテレータが終了しない場合は、トラブルを要求するように聞こえます...何かが足りないのですか?