2011-08-12 6 views
14

मुझे अभी पता चला कि स्थिर घटनाएं मौजूद हैं - और मैं उत्सुक हूं कि लोग उनका उपयोग कैसे करते हैं। मुझे आश्चर्य है कि रिश्तेदार तुलना स्थिर बनाम उदाहरण विधियों तक कैसे होती है। उदाहरण के लिए, एक स्थिर विधि मूल रूप से एक वैश्विक कार्य है। लेकिन मैंने हमेशा ऑब्जेक्ट्स के उदाहरणों के साथ घटनाओं को जोड़ा है और मुझे वैश्विक स्तर पर उनके बारे में सोचने में परेशानी हो रही है।स्थिर घटनाएं सी # में गैर स्थैतिक घटनाओं की तुलना कैसे करती हैं?

यहाँ कुछ कोड अगर यह एक व्याख्या में मदद करता है का उल्लेख करने के:

void Main() 
{ 
    var c1 = new C1(); 
    c1.E1 +=() => Console.WriteLine ("E1"); 
    C1.E2 +=() => Console.WriteLine ("E2"); 
    c1.F1(); 
} 

// <<delegate>>+D() 
public delegate void D(); 

// +<<event>>E1 
// +<<class>><<event>>E2 
// +F() 
//  <<does>> 
//   <<fire>>E1 
//   <<fire>>E2 
public class C1 
{ 
    public void F1() 
    { 
     OnE1(); 
     OnE2(); 
    } 
    public event D E1; 
    private void OnE1() 
    { 
     if(E1 != null) 
     { 
      E1(); 
     } 
    } 
    static public event D E2; 
    static private void OnE2() 
    { 
     if(E2 != null) 
     { 
      E2(); 
     } 
    } 
} 

उत्तर

14

संदेश भेजने के मामले में ओओपी का अधिकांश विचार किया जा सकता है।

एक विधि कॉल कॉलर से कैली (पैरामीटर ले जाने) और वापसी मूल्य के साथ एक संदेश है।

एक घटना स्रोत से ग्राहक को एक संदेश है। इस प्रकार संभावित रूप से दो उदाहरण शामिल हैं, जो संदेश भेज रहा है और इसे प्राप्त करने वाला एक है।

एक स्थिर घटना के साथ, कोई प्रेषण उदाहरण नहीं है (केवल एक प्रकार, जो कक्षा हो सकता है या नहीं भी हो सकता है)। प्रतिनिधि के लक्ष्य के रूप में एन्कोडेड प्राप्तकर्ता उदाहरण अभी भी हो सकता है।

1

स्टेटिक सदस्यों "वैश्विक," नहीं कर रहे हैं वे केवल वर्ग उदाहरणों की नहीं वर्ग के सदस्य हैं,। यह घटनाओं के लिए सच है क्योंकि यह विधियों, गुणों, फ़ील्ड इत्यादि के लिए है।

मैं एक स्थिर घटना का उपयोग करने के लिए एक उदाहरण नहीं दे सकता, क्योंकि मुझे आमतौर पर स्थिर सदस्यों को ज्यादातर मामलों में उपयोगी नहीं लगता है । (वे सिंगलटन की तरह विरोधी पैटर्न में संकेत करने के लिए, करते हैं।)

+0

तो ग्राहकों की सूची कक्षा स्तर पर भी सही है? क्या इसका मतलब यह है कि एक ही समय में सदस्यता लेने वाले कई थ्रेड खराब चीजों का कारण बनेंगे? –

+0

स्थिर घटनाओं के लिए डिफ़ॉल्ट कार्यान्वयन 'Interlocked.CompareExchange' का उपयोग करेगा जिसका अर्थ है कि दौड़ के मामले में, धागे में से एक की सदस्यता नहीं ली जाएगी। – cdhowie

+0

@cdhowie: यह 'Interlocked.CompareExchange' का बहुत मूर्खतापूर्ण उपयोग होगा। आम तौर पर तुलना-और-स्वैप को पुनः प्रयास लूप के साथ जोड़ा जाता है। –

3

मामले में आप स्थिर तरीकों

से परिचित आप शायद पहले से ही स्थिर तरीकों से परिचित हैं नहीं कर रहे हैं। यदि आप नहीं हैं, तो समझने में आसान अंतर यह है कि आपको किसी ऑब्जेक्ट को एक स्थिर विधि का उपयोग करने के लिए कोई ऑब्जेक्ट बनाने की आवश्यकता नहीं है, लेकिन आपको किसी ऑब्जेक्ट का एक उदाहरण बनाने की आवश्यकता है जिसे गैर- स्थैतिक विधि

एक अच्छा उदाहरण System.IO.Directory और System.IO.DirectoryInfo कक्षाएं है।

डायरेक्टरी क्लास स्थैतिक तरीकों की पेशकश करता है, जबकि DirectoryInfo क्लास नहीं करता है।

आपके लिए अंतर देखने के लिए यहां दो लेख दिए गए हैं।

http://visualcsharptutorials.com/2011/01/system-io-directory-class/

http://visualcsharptutorials.com/2011/01/system-io-directoryinfo-class/

अब पर स्थिर घटनाओं करने के लिए ...

हालांकि, स्थिर घटनाओं शायद ही कभी जंगली में देखा जाता है। ऐसे बहुत कम मामले हैं जिन्हें मैं ओपीएफ सोच सकता हूं जहां मैं वास्तव में एक का उपयोग करना चाहता हूं, लेकिन एक कोडप्रोजेक्ट आलेख है जो एक संभावित उपयोग दिखाता है।

http://www.codeproject.com/KB/cs/staticevent.aspx

यहाँ कुंजी सोचा (प्रासंगिक पाठ बताते बोल्ड मेरे द्वारा जोड़ा) स्पष्टीकरण से लिया जाता है:

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

.NET डेवलपर्स के रूप में हमें डिस्कनेक्ट किए गए मॉडल के साथ काम करने के लिए प्रशिक्षित किया जाता है। क्लासिक एडीओ की तुलना में ADO.NET के बारे में सोचें। एक वीबी 6 ऐप में, आप डेटा नियंत्रणों का उपयोग कर सकते हैं जो निम्न कार्यक्षमता की अनुमति देंगे: यदि आप अपने पीसी पर ऐप चला रहे थे, तो आपके ग्रिड में डेटा अपडेट होगा जब किसी अन्य पीसी पर किसी ने डेटा संपादित किया था।

ऐसा कुछ नहीं है जो .NET डेवलपर्स का उपयोग किया जाता है। हम डिस्कनेक्ट मॉडल के लिए बहुत उपयोग कर रहे हैं। स्टेटिक इवेंट्स अधिक "कनेक्टेड" अनुभव सक्षम करते हैं। (भले ही उस अनुभव कुछ हम किसी भी अधिक के लिए इस्तेमाल नहीं कर रहे हैं।)

+0

विवरण और उपयोगी संदर्भों के लिए धन्यवाद –

2
कुछ अंतर्दृष्टि के लिए

इस लिंक की जाँच http://www.codeproject.com/KB/cs/staticevent.aspx

स्थिर घटना

  • इस्तेमाल किया जा सकता है जब कोई उदाहरण मौजूद है
  • सभी मौजूदा उदाहरणों के लिए कुछ मल्टीकास्ट ईवेंट करने के लिए ...
  • जब आपके पास एक स्थैतिक वर्ग है जो ईवेंट को आग लग सकता है ...

लेकिन उन्हें cuation साथ इस्तेमाल करना चाहिए ... चर्चा को देखें http://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/2ac862f346b24a15/8420fbd9294ab12a%238420fbd9294ab12a?sa=X&oi=groupsr&start=1&num=2

अधिक जानकारी

http://msdn.microsoft.com/en-us/library/8627sbea.aspx
http://dylanbeattie.blogspot.com/2008/05/firing-static-events-from-instance.html
http://www.nivisec.com/2008/09/static-events-dont-release.html

45

स्थिर घटनाओं से सावधान रहें। याद रखें कि, जब कोई ऑब्जेक्ट किसी ईवेंट की सदस्यता लेता है, तो उस ऑब्जेक्ट का संदर्भ ईवेंट के प्रकाशक द्वारा आयोजित किया जाता है। इसका मतलब है कि आपको स्थैतिक घटनाओं से स्पष्ट रूप से सदस्यता समाप्त करने के बारे में बहुत सावधान रहना होगा क्योंकि वे हमेशा के लिए ग्राहक को जीवित रखेंगे, यानी, आप स्मृति रिसाव के प्रबंधित समकक्ष के साथ समाप्त हो सकते हैं।

+0

यह जानना बहुत अच्छा है - धन्यवाद –

+2

अच्छा बिंदु। कुछ मामलों में हालांकि यह कोई समस्या नहीं हो सकती है। कभी-कभी हैंडलर स्थिर भी हो सकता है। या यह एक सिंगलटन पर रह सकता है। –

+4

@TheDag: निश्चित रूप से, या कभी-कभी ऑब्जेक्ट (सब्सक्राइब) सदस्यता आपके आवेदन के पूरे जीवनकाल में मौजूद है। समस्या यह है कि जब भी आप इस स्थैतिक घटना की सदस्यता लेते हैं तो आपको अब इसके बारे में * सोचना होगा। यह मानसिक उपरांत जोड़ता है और हर कोई यह नहीं समझ पाएगा कि क्या हो रहा है। –

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