2010-02-25 4 views
7

.NET (कम से कम < = 2) में ऑब्जेक्ट्स को क्रमबद्ध करने में समस्या होती है जो घटनाओं को बढ़ाती है जब उन घटनाओं को गैर-धारावाहिक वस्तु (जैसे विंडोज फॉर्म) द्वारा नियंत्रित किया जाता है।क्या .NET 3/4 अनुमतियाँ बाइनरी डी/सीरियलाइज्ड होने की अनुमति है?

वीबीएनईटी घटनाओं को लागू करता है, जब आप किसी ऑब्जेक्ट को क्रमबद्ध करते हैं, तो इसकी घटनाओं को भी क्रमबद्ध किया जाता है (क्योंकि घटनाएं वास्तव में छिपी मल्टीकास्ट प्रतिनिधि फ़ील्ड का उपयोग करके लागू की जाती हैं)। इसका एक दुष्प्रभाव यह है कि किसी भी वस्तु जो धारावाहिक होने वाली वस्तु द्वारा उठाई गई घटनाओं को संभालती है उसे ऑब्जेक्ट ग्राफ़ का हिस्सा माना जाएगा और इसे क्रमबद्ध भी किया जाएगा।

कुछ समाधान पाया जा सकता है, कस्टम क्रमबद्धता को लागू करने या घटनाओं के बजाय प्रतिनिधियों का उपयोग कर:

हालांकि उनमें से कोई भी पूरी तरह से लेखकों और उपयोगकर्ताओं को संतुष्ट करने लगता है।

क्या .NET 3/4 इस समस्या को हल करता है?

+3

यह समस्या VB.NET के लिए विशिष्ट नहीं है - यह नेट कैसे काम करता है। –

+2

हालांकि सी # ve के साथ '[फ़ील्ड: NonSerialized]' का उपयोग कर एक और अधिक "लचीला" समाधान मिल सकता है। कम से कम, समस्या को हल करने के लिए पूरक सहायक कोड लिखने की कोई विशेष आवश्यकता नहीं है। – serhio

+0

@ सेरहियो: क्या यह विशेषता वीबी भी काम नहीं करती है? क्यों नहीं? मैं 'WithEvents' के बारे में बात नहीं कर रहा हूँ। –

उत्तर

3

घटनाक्रम एक प्रतिनिधि सदस्य के निर्माण द्वारा संभाले जाते हैं। यदि आप स्पष्ट रूप से इस सदस्य को स्वयं परिभाषित करते हैं, तो आप इसे NonSerialized विशेषता जोड़ने में सक्षम होना चाहिए। See this thread for a reference.

उदाहरण के लिए:

Public Delegate Sub MyEventDelegate() 

<NonSerialized()>Private m_MyEventDelegate As MyEventDelegate 

Public Custom Event MyEvent As MyEventDelegate 
    AddHandler(ByVal value As MyEventDelegate) 
     m_MyEventDelegate = DirectCast(System.Delegate.Combine(m_MyEventDelegate, value), MyEventDelegate) 
    End AddHandler 

    RemoveHandler(ByVal value As MyEventDelegate) 
     m_MyEventDelegate = DirectCast(System.Delegate.Remove(m_MyEventDelegate, value), MyEventDelegate) 
    End RemoveHandler 

    RaiseEvent() 
     If m_MyEventDelegate IsNot Nothing Then 
      m_MyEventDelegate.Invoke() 
     End If 
    End RaiseEvent 
End Event 
+0

वाक्यविन्यास के लिए धन्यवाद। मुझे नहीं लगता कि मैंने कभी 'RaiseEvent' वाक्यविन्यास देखा है। –

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