पृष्ठभूमि: मुझे स्ट्रिंग्स का एक गुच्छा मिला है जो मुझे डेटाबेस से मिल रहा है, और मैं उन्हें वापस करना चाहता हूं। परंपरागत रूप से, यह कुछ इस तरह होगा:सी # आईन्यूमेरेटर/उपज संरचना संभावित रूप से खराब है?
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;
}
लेकिन तब मैं समझ उपभोक्ता वस्तुओं के माध्यम से पुनरावृति करना चाहते करने जा रहा है और कुछ ज्यादा परवाह नहीं है, और मैं अपने आप में बॉक्स नहीं करना चाहते हैं एक सूची में, प्रति से, इसलिए यदि मैं एक आईनेमरेबल लौटाता हूं तो सबकुछ अच्छा/लचीला होता है। तो मैं इस तरह मैं एक "उपज वापसी" प्रकार डिजाइन का उपयोग इस संभाल करने के लिए कर सकता है सोच रहा था ... कुछ:
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 इसका उल्लेख नहीं कर रहा था), यह जाहिरा तौर पर एक आलसी मूल्यांकनकर्ता है, जो अगले मूल्य के लिए पूछने वाले किसी की प्रत्याशा में, आसपास के पॉप्युलेटर की स्थिति को बनाए रखता है, और फिर इसे तब तक चलाता है जब तक वह अगले मूल्य को वापस न कर लेता है।
यह ज्यादातर मामलों में ठीक लगता है, लेकिन एक डीबी कॉल के साथ, यह थोड़ा पासा लगता है। कुछ हद तक प्रत्याशित उदाहरण के रूप में, यदि कोई उस से एक आईएनयूमेरेबल मांगता है, तो मैं डीबी कॉल से पॉप्युलेट कर रहा हूं, इसमें से आधे से गुजरता है, और फिर लूप में फंस जाता है ... जहां तक मैं देख सकता हूं कि मेरा डीबी कनेक्शन जा रहा है हमेशा के लिए खुला रहने के लिए।
कुछ मामलों में परेशानी मांगने की तरह लगता है अगर इटरेटर खत्म नहीं होता है ... क्या मुझे कुछ याद आ रहा है?
संपादित करने के लिए धन्यवाद, जॉन ... कि मैं उड़ पर टाइपिंग के लिए क्या मिलता है। – Beska
जब तक आपका उपभोक्ता IENumerator पर 'निपटान' कहता है, तो आप सुरक्षित हैं। नीचे मेरी पोस्टिंग देखें। – tofi9