2009-09-25 10 views
13

.NET में संरक्षित या निजी (गैर स्थैतिक) घटनाओं का क्या उद्देश्य वास्तव में सेवा करता है?गैर स्थैतिक निजी या संरक्षित घटनाओं के लिए केस का क्या उपयोग मौजूद है?

ऐसा लगता है कि किसी भी निजी या संरक्षित घटना को आभासी विधि के माध्यम से अधिक आसानी से संभाला जाता है। मैं (कुछ हद तक) स्थिर घटनाओं में इसकी आवश्यकता को देख सकता हूं, लेकिन सामान्य घटनाओं के लिए नहीं।

क्या आपके पास उपयोगिता का मामला है इससे पहले कि यह स्पष्ट रूप से एक गैर स्थैतिक संरक्षित या निजी घटना के लिए आवश्यकता या लाभ प्रदर्शित करता है?

+0

खुद को जवाब देखने में दिलचस्पी है। अपना मामला बनाओ! –

उत्तर

6

मुझे लगता है कि एक निजी घटना उपयोगी है जहां एक निजी घटना उपयोगी है घटक/नियंत्रण भवन में, अक्सर आपके पास एक घटक हो सकता है जो 1 या अधिक अन्य घटकों का एक संयुक्त हो, निजी घटनाएं जिसमें घटक शामिल हो सकते हैं एक पर्यवेक्षक पैटर्न का एक आसान और आसान कार्यान्वयन है।

संपादित करें:

मुझे एक उदाहरण देता हूँ ...

कहो आप एक ग्रिड प्रकार के नियंत्रण लिख रहे हैं, और अंदर इस पर नियंत्रण की आप डायनामिक रूप से तैयार कर रहे हैं कि निहित वर्गों का एक समूह है सबसे अधिक संभावना होगी पंक्तियों, कर्नल, हेडर इत्यादि उदाहरण के लिए, कहते हैं कि आप इन निहित वर्गों को सूचित करना चाहते हैं कि जिन चीजों की वे परवाह करते हैं, उन्हें खुशी होती है, एक स्किनिंग परिवर्तन या ऐसा कुछ कहें, जो कुछ आप ग्रिड में एक घटना के रूप में प्रकट नहीं करना चाहते हैं उपयोगकर्ता, यह वह जगह है जहां निजी कार्यक्रम आसान होते हैं, बस एक या 2 हैंडलर होते हैं और जैसे ही आप अपनी पंक्ति या कॉल के प्रत्येक उदाहरण को बनाते हैं या जो कुछ भी हैंडलर संलग्न करते हैं, अन्यथा आपको बस लिखना होगा स्वयं पर्यवेक्षक तंत्र, कठिन नहीं है, लेकिन जब आपको नहीं करना है और आप मल्टीकास्ट घटनाओं का उपयोग कर सकते हैं।

+0

काम करने के लिए घटक के लिए, क्या व्यक्तिगत तत्वों को सार्वजनिक (या कम से कम आंतरिक) घटनाओं की आवश्यकता नहीं होगी? "समग्र घटक" अपने हिस्से (ओं) पर एक निजी या संरक्षित घटना की सदस्यता लेने जा रहा है? –

+0

निहित कक्षाएं केवल उसमें निहित हैं, इसलिए वे निजी घटना को परिभाषित करने वाले वर्ग के दायरे में हैं। –

+0

ओह, आप विशेष रूप से घोंसला वाले वर्ग के रूप में परिभाषित घटक के बारे में सोच रहे हैं? –

7

यहां एक छोटा विचित्र लेकिन असली दुनिया परिदृश्य है जिसे मैंने एक बार लागू किया था। आपके पास आंशिक वर्ग के मशीन से उत्पन्न और उपयोगकर्ता द्वारा उत्पन्न हिस्सों हैं। मशीन से उत्पन्न आधे में कोड होता है जो कुछ घटना होने पर उपयोगकर्ता द्वारा उत्पन्न आधे को सूचित करना चाहता है। लेकिन उपयोगकर्ता द्वारा उत्पन्न आधा कुछ भी करने की परवाह नहीं कर सकता है, या यह बहुत कुछ करने की परवाह कर सकता है। ऐसा लगता है कि मशीन से उत्पन्न आधे की कठोर प्रतीत होती है कि उपयोगकर्ता द्वारा उत्पन्न आधा एक संदेश को संभालने के लिए एक विशेष विधि को लागू करता है, जिसमें उन्हें सुनने में कोई रूचि नहीं है।

इस समस्या को हल करने के लिए, मशीन से उत्पन्न आधा एक निजी घटना पर आग लग सकता है। यदि उपयोगकर्ता द्वारा उत्पन्न आधे परवाह करता है, तो यह ईवेंट की सदस्यता ले सकता है। यदि नहीं, तो यह इसे अनदेखा कर सकता है।

इस परिदृश्य को अब सी # 3 में आंशिक तरीकों से अधिक सुंदरता से संबोधित किया गया है, लेकिन यह दिन में एक विकल्प नहीं था।

+0

बहुत रोचक, हालांकि मैं सहमत हूं कि आंशिक विधियां वर्तमान प्लेटफॉर्म में शायद एक और दिलचस्प विकल्प हैं। –

+0

संयोग से, जब हमने पहली बार उस वास्तुकला को डिजाइन किया था तो वीबी वास्तव में आपकी घटनाओं को सुनने का समर्थन नहीं करता था। मुझे विश्वास है कि यह अब करता है। –

1

नेस्टेड प्रकारों में संलग्न प्रकार की निजी और संरक्षित घटनाओं तक पहुंच है। मैंने सिल्वरलाइट एप्लिकेशन में अभिभावक नियंत्रण (संलग्न प्रकार) में राज्य परिवर्तनों के बाल नियंत्रण (नेस्टेड प्रकार) को सूचित करने के लिए इस सुविधा का उपयोग किया है।

0

क्षमा एक पुराने धागा ऊपर खींचें करने के लिए है, लेकिन मैं अपनी परियोजनाओं में से एक में दण्ड मुक्ति के साथ निजी घटनाओं का उपयोग करें, और व्यक्तिगत रूप से, मैं इसे एक डिजाइन मुद्दा हल के लिए एक अच्छा तरीका है लगता है:

यहाँ संक्षिप्त कोड है:

public class MyClass 
{ 
    private event EventHandler _myEvent; 

    public ExternalObject { get; set; } 

    public event EventHandler MyEvent 
    { 
    add 
    { 
     if (_myEvent.GetInvocationList().Length == 0 && value != null) 
     ExternalObject.ExternalEvent += HandleEvent; 
     _myEvent+= value; 
    } 
    remove 
    { 
     _myEvent-= value; 
     if (_myEvent.GetInvocationList().Length == 0) 
     ExternalObject.ExternalEvent -= HandleEvent; 
    } 
    } 

    private void HandleEvent(object sender, EventArgs e) 
    { 
    _myEvent.Raise(this, EventArgs.Empty); // raises the event. 
    } 
} 

असल में, MyEvent ही कभी ExternalObject.ExternalEvent के ईवेंट हैंडलर में उठाया है, इसलिए यदि वहाँ MyEvent के लिए कोई हैंडलर तो मैं एक सहेज कर थोड़ा कोड को तेज करने, बाहरी घटना के हैंडलर संलग्न करने की जरूरत नहीं है ढेर फ्रेम।

0

न केवल वर्तमान उदाहरण किसी निजी सदस्य तक पहुंच सकता है। एक ही प्रकार के अन्य उदाहरण भी कर सकते हैं!यह कुछ परिदृश्यों को सक्षम बनाता है जहां यह अभिगम नियंत्रण उपयोगी हो सकता है।

मैं एक वृक्ष संरचना के बारे में सोच रहा हूं जहां सभी नोड्स एक निश्चित प्रकार के उत्तराधिकारी होते हैं और एक निजी/संरक्षित घटना अपने माता-पिता को पत्ती की घटनाओं का प्रचार करने की अनुमति देती है। चूंकि वे एक ही प्रकार के हैं, इसलिए माता-पिता बच्चे के निजी कार्यक्रम में पंजीकरण कर सकते हैं। फिर भी वृक्ष संरचना का कोई भी ग्राहक नहीं कर सकता है।

मैं निश्चित रूप से भंडारण प्रणाली जैसे निर्देशिका में उपयोग केस देख सकता हूं जहां प्रत्येक निर्देशिका को इसके अंतिम संशोधित दिनांक को अपने माता-पिता को उदाहरण के लिए प्रसारित करने की आवश्यकता होती है।

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