2009-03-31 11 views
8
public sealed class FtpManager 
{ 
    public event EventHandler LoggingIn = delegate { }; 
    private void OnLoggingIn(object sender, EventArgs e) 
    { 
     var handler = LoggingIn; 
     handler(sender, e); 
    } 
// ... 
} 

उपर्युक्त कोड में, मैंने एक खाली प्रतिनिधि के साथ LoggingIn ईवेंट हैंडलर प्रारंभ किया है।

क्या इससे किसी भी तरह मेमोरी स्पेस को प्रभावित किया जाएगा? खासकर जब सैकड़ों या हजारों घटनाएं इस तरह घोषित की जाती हैं?क्या एक खाली प्रतिनिधि स्मृति को खाएगा?

+0

शामिल अतिरिक्त विधि कॉल के बारे में मत भूलना। आप अज्ञात प्रतिनिधि के माध्यम से ईवेंट ईवेंट हैंडलर और एक खाली विधि दोनों को कॉल करेंगे। मैंने कोई परीक्षण नहीं चलाया है, लेकिन आपको कम से कम इसके बारे में पता होना चाहिए ... –

उत्तर

13

पिछले उत्तर को स्क्रैच करें (वंशावली के लिए नीचे रखा गया है)। यह कंपाइलर के कार्यान्वयन पर निर्भर करता है, लेकिन वर्तमान एमएस सी # 3.0 कंपाइलर के तहत, यह वास्तव में केवल एक ही उदाहरण बनाता है जिसे प्रत्येक उदाहरण के लिए पुन: उपयोग किया जाता है। ऐसा करने में सक्षम है क्योंकि प्रतिनिधि अपरिवर्तनीय हैं और प्रतिनिधि को उदाहरण से किसी भी जानकारी की आवश्यकता नहीं है।

मुझे नहीं पता कि यह सी # 2.0 के साथ मामला था या नहीं। आप अपने कोड को संकुचित कर सकते हैं और देख सकते हैं कि आईएल वास्तव में कैश किए गए क्षेत्र का उपयोग करता है या नहीं। नीचे दिए गए उत्तर का उपयोग गारंटी पर एक सुरक्षित तरीका है, हालांकि आप केवल एक उदाहरण बनायेंगे।

मूल जवाब:

हाँ, यह एक प्रतिनिधि का एक उदाहरण बनाता है। इसमें कुछ याद आएगी। आप इसे कम कर सकते हैं हालांकि:

public static class EventHandlers 
{ 
    public static readonly EventHandler Empty = delegate {}; 
} 

public sealed class FtpManager 
{ 
    public event EventHandler LoggingIn = EventHandlers.Empty; 
} 

उस बिंदु पर केवल एक उदाहरण होगा, और आप इसे कहीं से भी देख सकते हैं। नकारात्मकता यह है कि अन्य वर्ग एक ही हैंडलर का उपयोग करके सदस्यता समाप्त कर सकते हैं। यदि आप अपने शेष कोडबेस पर विश्वास नहीं करते हैं, तो यह संभवतः स्मृति बिंदु से सबसे अच्छा शर्त है।

+0

वाह, मुझे लगता है कि मेरा ऐप उच्च मेमोरी उपयोग के साथ जंगली चल रहा है क्योंकि मैं रिक्त स्थान के साथ घटनाओं की घोषणा कर रहा हूं प्रतिनिधि...; धन्यवाद, जॉन – Sung

+0

@ सुंग: मैंने अपना जवाब पूरी तरह बदल दिया है। वापस जायेंगे और पिछले संस्करण को भी संपादित करने के लिए संपादित करेंगे! –

+0

@ सुंग: ठीक है, अब यह काफी अधिक पूर्ण है। आपको यह जांचने में सक्षम होना चाहिए कि यह आपके ऐप को कम करके आपकी समस्या है या नहीं। प्रतिबिंबक इसके लिए अच्छा है, लेकिन आपको वास्तव में क्या हो रहा है इसके बारे में सुनिश्चित करने के लिए आईएल को देखना होगा। –

-1

ऐसा करने का विकल्प हर बार जब आप इसे उठाना चाहते हैं तो लॉगिंगइन की जांच कर रहे हैं। एक खाली प्रतिनिधि को बुलाए जाने की तुलना में यह अधिक स्मृति गहन होने के लिए उत्तरदायी है।

+0

क्या आपने इसका समर्थन करने के लिए कोई परीक्षण चलाया था, या सिर्फ एक धारणा है? –

+0

नहीं। मैंने बस एक सीमित कारक की ओर इशारा किया। यदि आप परीक्षण चाहते थे, तो आप उन्हें किसी और के रूप में आसानी से लिख सकते थे। –

संबंधित मुद्दे