2012-01-03 8 views
15

मैं ऑटो-कार्यान्वित गुणों का उपयोग करना चाहता हूं, लेकिन साथ ही जब भी संपत्ति बदल जाती है, मैं एक विधि को कॉल करना चाहता हूं।स्वचालित गुणों के सी # में सेट को ओवरराइड करने के लिए कैसे करें

public float inverseMass 
{ 
    get; 
    set 
    { 
     onMassChanged(); 
     inverseMass = value; 
    } 
} 

क्या पिछला कोड संपत्ति पर रिकर्सिव कॉल करता है? यदि ऐसा होता है, तो इसे कैसे कार्यान्वित करें?

+6

आप इसे सी # में नहीं कर सकते हैं। आपको बैकिंग फ़ील्ड का उपयोग करना होगा। –

+2

उत्तर हाँ है .... यह एक सतत पाश बना देगा। –

+2

@UweKeim, यह एक जवाब होना चाहिए। – driis

उत्तर

22

यदि आप अपना स्वयं का सेट/सेट प्रदान करते हैं तो आपको चर के लिए अपना स्वयं का संग्रहण प्रदान करने की आवश्यकता है।

private float _inverseMass; 

public float inverseMass 
{ 
    get { return _inverseMass; } 
    set 
    { 
     _inverseMass = value; 
     onMassChanged(); 
    } 
} 
+6

यह एक दयालु है। ऑटो प्रॉपर्टी बनाने के बजाय 'वैल्यू' जैसे किसी प्रकार के सामान्य पूर्वनिर्धारित शब्द का उपयोग करना अच्छा लगेगा। –

4

आप इसे सी # में नहीं कर सकते हैं।

बैकिंग फ़ील्ड के साथ या तो स्वचालित संपत्ति या संपत्ति।

public float inverseMass 
{ 
    get 
    { 
     return _inverseMass; 
    } 
    set 
    { 
     onMassChanged(); 
     _inverseMass = value; 
    } 
} 

private float _inverseMass; 

मैं एक बार कहीं पढ़ा सी # लोग फैसला किया है कि कि वे उन स्वत: गुणों के साथ उपयोग परिदृश्यों के व्यापक कवर करने के लिए चाहता था, लेकिन विशेष मामलों में आप जाना है:

8

बजाय एक समर्थन फ़ील्ड का उपयोग करें अच्छे पुराने समर्थन क्षेत्रों में वापस।

(ईमानदारी से कहूं तो मुझे विश्वास है कि जॉन स्कीट उन्हें लागू करने के उन से कहा)

4

आप निजी/सार्वजनिक सदस्यों के लिए आपको उपरोक्त बाहर तोड़ ताकि आप पुनरावर्ती समस्याओं नहीं मिलता है की आवश्यकता होगी:

private float _inverseMass; 
public float inverseMass 
{ 
    get { return this._inverseMass; } 
    set { this._inverseMass = value; onMassChanged(); } 
} 

हालांकि, क्या आपने INotifyPropertyChanged इंटरफ़ेस में देखा है? यह बहुत कुछ करता है जो आप खोज रहे हैं, और जो भी आप लिख रहे हैं उसके आधार पर इसे मूल रूप से समर्थित किया जा सकता है।

public class MyClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String property) 
    { 
    var event = this.PropertyChanged; 
    if (event != null) 
    { 
     event(this, new PropertyChangedEventArgs(property)); 
    } 
    } 

    private float _inverseMass; 
    public float inverseMass 
    { 
    get { return this._inverseMass; } 
    set { this._inverseMass = value; NotifyPropertyChanged("inverseMass"); } 
    } 
} 
1

यह संकलित नहीं करता है, इसलिए यह कहना मुश्किल है कि यह रिकर्सिव है या नहीं।

आप स्वचालित संपत्ति का केवल एक हिस्सा निर्दिष्ट नहीं कर सकते हैं। आप इस मामले में एक समर्थन क्षेत्र का उपयोग करने की आवश्यकता होगी:

private float _inverseMass; 
public float inverseMass 
{ 
    get { return _inverseMass; } 
    set 
    { 
     onMassChanged(); 
     _inverseMass = value; 
    } 
} 

हालांकि, PostSharp की तरह एक aspected ओरिएंटेड प्रोग्रामिंग ढांचे इसमें सहायता करने में सक्षम हो सकता है।

0

सार्वजनिक संपत्ति के लिए अपने बैक अप फ़ील्ड के रूप में एक निजी चर का उपयोग करें।

private float inverseMass; 

public float InverseMass{ 

    set 
    { 
     onMassChanged(); 
     inverseMass=value; 
    } 
    get 
    { 
     return inverseMass; 
    } 

} 
-2
public float inverseMass 
{ 
    get; 
    set 
    { 
     if (inverseMass != value) 
     { 
      inverseMass = value; 
      onMassChanged(); 
     } 
    } 
} 
+0

आप यहाँ क्या कहने की कोशिश कर रहे हैं? यह जवाब संकलित नहीं करता है। – vcsjones

1

सही उत्तरों ऊपर दिए गए हैं, लेकिन मामले में आप दृश्य स्टूडियो में जल्दी से यह करने के लिए चाहता था, आप कोड स्निपेट के बजाय का उपयोग आप के लिए संपत्ति उत्पन्न करने के लिए कर सकते हैं। http://www.roelvanlisdonk.nl/?p=1007

यदि आप चाहते हैं, आप भी दोहराए कोड जोड़ने के लिए अपने स्वयं के कोड का टुकड़ा बना सकते हैं:

इस लेख के लिए पठन जो यह थोड़ा बेहतर व्याख्या करनी चाहिए है। उपरोक्त वर्णित INOTifyPropertyChanged कार्यान्वयन को त्वरित रूप से उत्पन्न करने के लिए आप इसका उपयोग भी कर सकते हैं।

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

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