Bối cảnh: Tôi có một chuỗi các chuỗi mà tôi nhận được từ một cơ sở dữ liệu và tôi muốn trả lại chúng. Theo truyền thống, nó sẽ là một cái gì đó như thế này:C# IEnumerator/cấu trúc năng suất có khả năng xấu?
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;
}
Nhưng sau đó tôi tìm được người tiêu dùng sẽ muốn lặp qua các mục và không quan tâm đến nhiều thứ khác nữa, và tôi muốn không hộp bản thân mình trong vào Danh sách, mỗi lần, vì vậy nếu tôi trả về mọi thứ IEnumerable thì tốt/linh hoạt. Vì vậy, tôi đã suy nghĩ tôi có thể sử dụng một thiết kế "yield return" loại để xử lý này ... một cái gì đó như thế này:
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();
}
}
}
}
Nhưng bây giờ mà tôi đang đọc thêm một chút về năng suất (trên các trang web như thế này .. .msdn dường như không đề cập đến điều này), nó dường như là một người đánh giá lười biếng, giữ cho trạng thái của populator xung quanh, với dự đoán ai đó yêu cầu giá trị tiếp theo, và sau đó chỉ chạy nó cho đến khi nó trả về giá trị tiếp theo.
Điều này có vẻ tốt trong hầu hết các trường hợp, nhưng với cuộc gọi DB, điều này nghe có vẻ hơi khó chịu. Như một ví dụ hơi khó hiểu, nếu ai đó yêu cầu một IEnumerable từ đó tôi đang cư trú từ một cuộc gọi DB, được thông qua một nửa của nó, và sau đó bị mắc kẹt trong một vòng lặp ... như xa như tôi có thể thấy kết nối DB của tôi sẽ để mở mãi mãi.
Âm thanh như yêu cầu sự cố trong một số trường hợp nếu trình lặp không kết thúc ... tôi có thiếu gì đó không?
Cảm ơn đã sửa, Jon ... đó là những gì tôi nhận được để gõ một cách nhanh chóng. – Beska
Miễn là người tiêu dùng gọi 'Vứt bỏ' trên IEnumerator, bạn an toàn. Xem bài đăng của tôi dưới đây. – tofi9