में प्रतिनिधियों के साथ समस्या निम्न प्रोग्राम में, DummyMethod हमेशा प्रिंट 5। लेकिन अगर हम इसके बजाय टिप्पणी कोड का उपयोग करते हैं, तो हमें अलग-अलग मान मिलते हैं (यानी 1, 2, 3, 4)। क्या कोई यह बता सकता है कि यह क्यों खुश है?सी #
delegate int Methodx(object obj);
static int DummyMethod(int i)
{
Console.WriteLine("In DummyMethod method i = " + i);
return i + 10;
}
static void Main(string[] args)
{
List<Methodx> methods = new List<Methodx>();
for (int i = 0; i < 5; ++i)
{
methods.Add(delegate(object obj) { return DummyMethod(i); });
}
//methods.Add(delegate(object obj) { return DummyMethod(1); });
//methods.Add(delegate(object obj) { return DummyMethod(2); });
//methods.Add(delegate(object obj) { return DummyMethod(3); });
//methods.Add(delegate(object obj) { return DummyMethod(4); });
foreach (var method in methods)
{
int c = method(null);
Console.WriteLine("In main method c = " + c);
}
}
यदि निम्न कोड का उपयोग किया जाता है, तो मुझे वांछित परिणाम मिलते हैं।
for (int i = 0; i < 5; ++i)
{
int j = i;
methods.Add(delegate(object obj) { return DummyMethod(j); });
}
इस प्रश्न का समर्थन। इस प्रकार का व्यवहार सिर्फ "खतरनाक" लगता है। मैं शर्त लगाता हूं कि यह उन कठिन-से-डीबग मुद्दों में से एक के रूप में अधिक बार आने वाला है क्योंकि सी # encapsulating व्यवहार के प्रतिनिधि-उन्मुख तरीके की ओर अधिक से अधिक चलता है। यह स्विच क्लॉज के लूपिंग समकक्ष की तरह है जो अनिवार्य "ब्रेक" के बिना नीचे की ओर कैस्केड करने की अनुमति है खंड –
@ नील: मैं मानता हूं कि यह गॉचा-हॉटस्पॉट है। जब यह "foreach" के साथ देखा जाता है तो यह अधिक भ्रमित होता है - इतना है कि सी # टीम उस मामले के व्यवहार को बदलने पर विचार कर रही है। (एक परिदृश्य के बारे में सोचना मुश्किल है जहां foreach व्यवहार वांछनीय है; लूप स्थिति अधिक समझने योग्य है क्योंकि यह स्पष्ट है कि चर केवल एक बार घोषित किया जाता है।) –
[सी # कैप्चर किए गए चरणीय लूप] के संभावित डुप्लिकेट (http: //stackoverflow.com/questions/271440/c-sharp-captured-variable-in-loop) – nawfal