एक लैम्ब्डा (या क्लोजर ) फंक्शन पॉइंटर और वैरिएबल दोनों को एनकैप्सुलेट करता है। यही कारण है, सी # में, आप कर सकते हैं:
int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
return i < lessThan;
};
मैंने एक अनाम प्रतिनिधि को एक क्लोजर के रूप में इस्तेमाल किया (यह वाक्यविन्यास थोड़ा स्पष्ट है और लैंबडा समतुल्य की तुलना में C के करीब है), जिसने क्लोजर में कम (एक स्टैक चर) पर कब्जा कर लिया। जब क्लोजर का मूल्यांकन किया जाता है, तो कमटैन (जिसका स्टैक फ्रेम नष्ट हो गया हो) को संदर्भित किया जाता रहेगा। यदि मैं कम बदल देता हूं, तो मैं तुलना बदल देता हूं:
int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
return i < lessThan;
};
lessThanTest(99);
lessThan = 10;
lessThanTest(99);
सी में, यह अवैध होगा:
BOOL (*lessThanTest)(int);
int lessThan = 100;
lessThanTest = &LessThan;
BOOL LessThan(int i) {
return i < lessThan;
}
हालाँकि मैं एक फ़ंक्शन पॉइंटर को परिभाषित कर सकता हूँ जो 2 तर्क देता है:
int lessThan = 100;
BOOL (*lessThanTest)(int, int);
lessThanTest = &LessThan;
lessThanTest(99, lessThan);
lessThan = 10;
lessThanTest(100, lessThan);
BOOL LessThan(int i, int lessThan) {
return i < lessThan;
}
लेकिन, अब मुझे इसका मूल्यांकन करने पर २ तर्क पास करने होंगे। अगर मैं इस फंक्शन पॉइंटर को किसी अन्य फंक्शन में पास करना चाहता हूं, जहां लोथन स्कोप नहीं है, तो मुझे या तो इसे चेन में प्रत्येक फंक्शन में पास करके, या फिर इसे ग्लोबल में प्रमोट करके मैन्युअल रूप से जीवित रखना होगा।
यद्यपि अधिकांश मुख्यधारा की भाषाएं जो बंद का समर्थन करती हैं, अनाम कार्यों का उपयोग करती हैं, उसके लिए कोई आवश्यकता नहीं है। आप गुमनाम कार्यों के बिना बंद हो सकते हैं, और बिना बंद किए अनाम कार्य कर सकते हैं।
सारांश: एक क्लोजर फ़ंक्शन पॉइंटर + कैप्चर किए गए चर का एक संयोजन है।