आपकी स्थिति ठीक है; घटना ग्राहकप्रकाशक को एकत्रित होने से नहीं रोकेगा, लेकिन विपरीत हो सकता है।
उदाहरण के लिए,
class Foo
{
public event EventHandler FooEvent;
void LeakMemory()
{
Bar bar = new Bar();
bar.AttachEvent(this);
}
}
class Bar
{
void AttachEvent(Foo foo)
{
foo.FooEvent += (sender, e) => { };
}
}
इस मामले में, LeakMemory
में बनाई गई Bar
के कहने जब तक या तो
- गुमनाम विधि लैम्ब्डा द्वारा प्रतिनिधित्व
FooEvent
से निकाल दिया जाता एकत्र नहीं किया जा सकता ' एस आमंत्रण सूची
- फू का उदाहरण जिस पर इसे संलग्न किया गया है
ऐसा इसलिए है क्योंकि घटना (जो सामान्य delegate
उदाहरण पर केवल कुछ वाक्य रचनात्मक चीनी है) प्रतिनिधियों की एक सूची पर आती है जब इसे बुलाया जाता है, और इन प्रतिनिधियों में से प्रत्येक ने ऑब्जेक्ट का संदर्भ दिया है कि यह जुड़ा हुआ है (इस मामले में, Bar
का उदाहरण)।
ध्यान दें कि हम केवल संग्रह पात्रता संग्रह के बारे में बात कर रहे हैं। सिर्फ इसलिए कि यह योग्य है के बारे में कुछ भी नहीं कहता है जब (या यहां तक कि, वास्तव में, यदि) यह एकत्र किया जाएगा, बस हो सकता है।
स्रोत
2011-02-22 17:32:10
वहाँ किसी भी मानक फार्म/"कमजोर संदर्भ घटनाओं" का मुहावरा है: हालांकि यह तार के विपरीत वे अर्थ की दृष्टि से जब समानता का निर्धारण करने की तुलना में नहीं हैं, क्योंकि lambdas "समारोह शाब्दिक" कर रहे हैं, एक तरह से स्ट्रिंग शाब्दिक की तरह? –
@pst: दुर्भाग्य से, नहीं। यह ऐसा कुछ है जिस पर पहले चर्चा की गई है (अधिक आम तौर पर, उन संदर्भों पर विचार न करें जो * केवल * प्रतिनिधियों का हिस्सा पहुंचने योग्य हैं), लेकिन जटिलताओं और संभावित नुकसान ने इसे अब तक लागू करने से रोका है। आखिरी बार देखे जाने के बाद से उन योजनाओं में बदलाव हो सकते हैं, लेकिन जहां तक मुझे पता है कि चीजें खड़ी हैं और जारी रहेगी। यहां तक कि 'WeakReference' क्लास का उपयोग करने वाले समाधान भी इस मुद्दे को किसी अन्य प्रकार पर ले जाते हैं। –