2010-10-01 3 views
6

मैं जानना चाहता हूं, अगर किसी भी निजी या सार्वजनिक क्षेत्र का मूल्य बदल गया है। क्या GetHashCode() या सीआरसी की गणना करने के अलावा कोई अन्य तरीका है?सी # वस्तु में कुछ जानने का सबसे तेज़ तरीका बदल गया है?

एल्गोरिदम भी तेज होना चाहिए।

शुक्रिया,

-Brajesh

+6

GetHashCode चाहिए केवल हैश उदाहरण जिम्मेदार बताते हैं कि वास्तव में identiy से जुड़े हुए हैं, नहीं करने के लिए कि किसी दिए गए उदाहरण में बदल गया है, यह उदाहरण की पहचान से संबंधित है के लिए उपयोगी नहीं है और इस प्रकार प्रत्येक और आपके उदाहरण में हर मूल्य। –

+2

क्या आपके पास प्रश्न के प्रकार के लिए स्रोत कोड है या क्या इसे मनमाने ढंग से काम करना है? –

उत्तर

5

आम तौर पर, इस INotifyPropertyChanged इंटरफेस (link) के साथ किया जा जाएगा। यह वास्तव में केवल गुणों के साथ इसका उपयोग करने के लिए व्यावहारिक है, हालांकि, फ़ील्ड नहीं। हालांकि, आप अपने प्रत्येक निजी क्षेत्र के लिए एक निजी संपत्ति बना सकते हैं। एक बार आपके पास संपत्ति के रूप में सब कुछ हो जाने के बाद, सेटर संपादित करें ताकि आप यह जांच सकें कि मान बदल गया है या नहीं, तो NotifyPropertyChanged() पर कॉल करें।

उदाहरण:

public event PropertyChangedEventHandler PropertyChanged; 

private int _foo; 

public int Foo 
{ 
    get { return _foo; } 
    set 
    { 
     if (_foo != value) 
     { 
      _foo = value; 
      NotifyPropertyChanged("Foo"); 
     } 
    } 
} 

private void NotifyPropertyChanged(string info) 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(info)); 
    } 
} 
2

आप अपना सभी डेटा (जो आप बदलाव के लिए निगरानी करना चाहते हैं) प्राप्त/सेट accessors (यानी गुण) के अंदर संपुटित कर सकते हैं। सच करने के लिए

  • सेट _dirty

या (आप इसे बाद में जांच करने की आवश्यकता है, तो):

फिर, सेट एक्सेसर में, देखें कि क्या मूल्य बदल गया है, नए मूल्य के लिए सेट है, और

  • उठाने के अपनी पसंद के किसी घटना

सीआरसी पर कुछ नोट्स - भले ही आपके ऑब्जेक्ट के लिए गैर-टकराव सीआरसी/एचएएसएच एल्गोरिदम है, आपके पास कहीं भी मूल हैश होना चाहिए। लेकिन सरल हैश डुप्लिकेट होने की संभावना है, इसलिए आपके पास फिर से गति समस्या है।

1

यदि इसे किसी भी प्रकार के लिए काम करने की आवश्यकता है और किसी भी संशोधन का पता लगाने की आवश्यकता नहीं है, तो कोई झूठी नकारात्मक या झूठी सकारात्मक नहीं है, मुझे संदर्भ के लिए सभी फ़ील्ड मानों की एक प्रति से बेहतर तरीका नहीं दिखता है। जब से तुम यह तेजी से होने की जरूरत है, मैं निम्नलिखित की सिफारिश करेंगे:

  1. एक नियमित प्रतिबिंब का उपयोग करता है सभी फ़ील्ड मानों का एक उथले प्रतिलिपि प्रदर्शन करने के लिए लिखें।

  2. एक नियमित है कि मूल्य द्वारा खेतों तुलना लिखें (आप नेस्टेड ढांचे में परिवर्तन, सरणियों या संग्रह की तरह के लिए देख रहे हैं, आपकी समस्या बहुत मुश्किल है।)

  3. एक बार ऊपर काम करते हैं, आप कर सकते हैं IL Emit का उपयोग करें और कोड लिखें जो एक बार प्रतिबिंब करता है और उथले-प्रति और तुलना संचालन के लिए कोड उत्सर्जित करता है। अब आपके पास कुछ डायनामिक मोड विधि हैं जिनका उपयोग आप प्रत्येक ऑपरेशन के लिए कर सकते हैं। उत्सर्जित और जलाए जाने के बाद ये काफी तेज़ होते हैं।

    हर सार्वजनिक सेटर में
1

सम्मिलित एक बूलियन मान, m_IsChanged की तरह है, तो एक सार्वजनिक गेटर का उपयोग कर ही अगर संपत्ति में से एक बदल दिया गया है की जाँच करने के।

उदाहरण:

private bool m_IsChanged = false; 

private double m_DoubleValue; 

//[...] all other private properties 

public double DoubleValue 
{ 
    get { return m_DoubleValue; } 
    set 
    { 
     if(m_DoubleValue != value) 
      m_IsChanged = true; 

     m_DoubleValue = value; 
    } 
} 

//[...] all other getters/setters 

public bool IsChanged 
{ 
    get { return m_IsChanged; } 
} 
संबंधित मुद्दे

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