उस स्थिति पर विचार करें जिसमें आप एक और केवल एक अधिसूचना के लिए किसी ईवेंट की सदस्यता लेना चाहते हैं। एक बार पहली अधिसूचना भूमि हो जाने के बाद, आप सभी भावी घटनाओं से सदस्यता छोड़ लेते हैं। क्या निम्न पैटर्न किसी स्मृति समस्या को पेश करेगा? यह काम करता है, लेकिन मुझे यकीन नहीं था कि आत्म-संदर्भ बंद करने से चीजों को वांछित से अधिक स्मृति में चारों ओर रख सकता है।क्या बंद होने के माध्यम से किसी ईवेंट से स्वयं को सदस्यता समाप्त करने का निम्न पैटर्न कोई समस्या पैदा करेगा?
public class Entity
{
public event EventHandler NotifyEvent;
}
// And then, elsewhere, for a listen-once handler, we might do this:
Entity entity = new Entity();
Action<object, EventArgs> listener = null;
listener = (sender, args) =>
{
// do something interesting
// unsubscribe, so we only get 1 event notification
entity.NotifyEvent -= new EventHandler(listener);
};
entity.NotifyEvent += new EventHandler(listener);
नोट आप 'श्रोता' घोषित करने और एक मूल्य (शून्य) आवंटित करने के लिए है। अन्यथा संकलक 'असाइन किए गए स्थानीय चर का उपयोग listener
'
ब्रेसिज़ में 'एक्शन <ऑब्जेक्ट, इवेंटआर्ग> श्रोता = नल;' से शुरू होने वाले कोड के हिस्से को संलग्न करके आप अपना कोड अधिक अभिव्यक्ति कर सकते हैं। लेकिन मुझे यकीन नहीं है कि क्या यह कचरा कलेक्टर के लिए जीवन को आसान बना देगा: आखिरकार, आप वैसे भी अपने चर का उपयोग नहीं करते हैं! – Vlad