C # में लैम्ब्डा एक्सप्रेशन या अनाम विधियों का उपयोग करते समय, हमें संशोधित क्लोजर पिटफुल तक पहुंच से सावधान रहना होगा । उदाहरण के लिए:
foreach (var s in strings)
{
query = query.Where(i => i.Prop == s); // access to modified closure
...
}
संशोधित क्लोजर के कारण, उपरोक्त कोड Where
क्वेरी के सभी क्लॉज़ के अंतिम मूल्य के आधार पर कारण होगा s
।
जैसा कि यहां बताया गया है , ऐसा इसलिए होता है क्योंकि ऊपर दिए s
गए foreach
लूप में घोषित चर का अनुवाद इस तरह किया जाता है:
string s;
while (enumerator.MoveNext())
{
s = enumerator.Current;
...
}
इस तरह के बजाय:
while (enumerator.MoveNext())
{
string s;
s = enumerator.Current;
...
}
जैसा कि यहां बताया गया है , लूप के बाहर एक वैरिएबल घोषित करने के लिए कोई प्रदर्शन लाभ नहीं हैं, और सामान्य परिस्थितियों में केवल यही कारण है कि मैं ऐसा करने के लिए सोच सकता हूं यदि आप लूप के दायरे से बाहर चर का उपयोग करने की योजना बनाते हैं:
string s;
while (enumerator.MoveNext())
{
s = enumerator.Current;
...
}
var finalString = s;
हालाँकि foreach
लूप में परिभाषित चर का उपयोग लूप के बाहर नहीं किया जा सकता है:
foreach(string s in strings)
{
}
var finalString = s; // won't work: you're outside the scope.
इसलिए संकलक चर को इस तरह से घोषित करता है, जिससे यह एक त्रुटि के लिए अत्यधिक प्रवण होता है, जो कि बिना किसी लाभकारी लाभ के उत्पादन के लिए अक्सर ढूंढना और डिबग करना मुश्किल होता है।
क्या कोई ऐसी चीज है जिसे आप foreach
लूप्स के साथ कर सकते हैं जो कि आप नहीं कर सकते अगर उन्हें एक इनर-स्कोप्ड वैरिएबल के साथ संकलित किया गया था, या यह सिर्फ एक अनियंत्रित विकल्प है जो गुमनाम तरीकों और लैम्ब्डा एक्सप्रेशन उपलब्ध होने या सामान्य होने से पहले बनाया गया था, और जो hasn तब से संशोधित नहीं किया गया है?
foreach
लेकिन ओपी द्वारा दिखाए गए समान कोड के परिणामस्वरूप लैम्डा अभिव्यक्तियों के बारे में ...
String s; foreach (s in strings) { ... }
?