Scoping एक तरफ (अर्थात चर लूप के बाहर मौजूद है या नहीं) वहाँ आमतौर पर कोई अंतर नहीं है, के बाद से नेट चर वैसे भी शुरू विधि के पर वास्तव में कर रहे (IL) में सभी। हालांकि, एक अपवाद है: यदि आप चर (एक अज्ञात विधि/लैम्ब्डा में) को कैप्चर करते हैं, तो यह अलग-अलग व्यवहार करता है - कैप्चर सी # घोषणा के संबंध में बनाया गया है। तो:
List<Action> actions = new List<Action>();
ClassA objectA;
for (int i=0;i<9;i++)
{
objectA= new ClassA();
actions.Add(delegate { Console.WriteLine(objectA.GetHashCode()); });
}
foreach(Action action in actions) action();
और: (पहले प्रिंट ही पता आधारित हैश कोड 9 बार
List<Action> actions = new List<Action>();
for (int i=0;i<9;i++)
{
ClassA objectA= new ClassA();
actions.Add(delegate { Console.WriteLine(objectA.GetHashCode()); });
}
foreach(Action action in actions) action();
अलग बातें करेंगे, दूसरा प्रिंट 9 अलग पता आधारित हैश -कोड्स, यह दर्शाता है कि दूसरे लूप में हमने 9 अलग-अलग वैरिएबल को एक चर के बजाय कैप्चर किया है)।
दोनों मामलों में 9 ClassA
ऑब्जेक्ट बनाए गए हैं - बस हम पहले मामले में उनमें से 8 को और नहीं देख सकते हैं।
स्रोत
2010-02-23 20:20:29
+1 क्योंकि यह वास्तव में दिलचस्प है। –
सामान्य मार्क के रूप में, आप उम्मीद से परे पहुंचते हैं। लैम्ब्डा करते समय दायरा कभी-कभी क्रैक करने के लिए एक कठिन अखरोट है।मुझे यकीन है कि हम सभी को ऊपर बताए गए स्कोपिंग समस्या से जला दिया गया है। मुझे पता है मेरे पास है। चीयर्स! – TheSoftwareJedi