2016-08-09 8 views
5

मैं एक संपत्ति के साथ एक वस्तु है जिसके लिए मैं एक कस्टम सेटर बनाने के लिए और भी स्वत: गेटर रखने चाहते हैं:कस्टम सेटर लेकिन ऑटो गेटर

public class SomeObject 
{ 
    public int SomeProp { get; set; } 
    public Nullable<short> MyProp 
    { 
     get 
     { 
     return MyProp; 
     } 
     set 
     { 
     if (value != null) 
     { 
      SomeProp = SomeWork(value); 
      MyProp = value; 
     } 
     } 
    } 
} 

समस्या यह है कि मैं गेटर पर एक Stackoverflow त्रुटि मिलती है । मैं एक ऐसी संपत्ति को कैसे कार्यान्वित करूं जहां मैं गेटटर को रखूं, लेकिन केवल सेटटर को संशोधित करता हूं?

+13

आप नहीं कर सकते। आपको एक फ़ील्ड चाहिए – SLaks

+0

इस मामले में, आपको एक दूसरे क्षेत्र की आवश्यकता है। अन्यथा, आपको गेटर – mmcrae

+3

में एक अनंत लूप मिलता है, मुझे यह नहीं मिलता है, सभी डाउनवॉट्स के साथ क्या होता है? – Steve

उत्तर

5

आपको अपनी संपत्ति के लिए बैकिंग फ़ील्ड का उपयोग करने की आवश्यकता है। आपको एक एसओ त्रुटि मिल रही है क्योंकि आप अपने MyProp संपत्ति को अपने स्वयं के गेटटर में संदर्भित कर रहे हैं जिसके परिणामस्वरूप अनंत रिकर्सन हो रहा है।

private short? _myProp; 

public short? MyProp 
{ 
    get 
    { 
     return _myProp; 
    } 
    set 
    { 
     if (value != null) 
     { 
      SomeProp = SomeWork(value); 
      _myProp = value; 
     } 
    } 
} 
+0

धन्यवाद; पहले कभी इस किनारे का मामला कभी नहीं था। – frenchie

+0

जब भी आप ऑटो कार्यान्वित गुणों का उपयोग करते हैं, तब भी एक अंतर्निहित बैकिंग फ़ील्ड है जो आपके लिए स्वचालित रूप से बनाया जाता है। –

2

आपको अपवाद मिलता है क्योंकि आप अनिवार्य रूप से अपनी संपत्ति में अनंत रिकर्सन कर रहे हैं।

दुर्भाग्य से आप जो वर्णन कर रहे हैं वह सी # में संभव नहीं है, आपको बैकिंग फ़ील्ड को स्वयं परिभाषित करने की आवश्यकता है।

+0

क्या इसे कभी लागू किया जाएगा? मुझे आश्चर्य है ... –

+0

@roryap, मुझे ऐसा नहीं लगता है और न ही इसे लागू करने के लिए तर्क/लाभ देखें। – Rahul

+0

@roryap मुझे उम्मीद है कि यह अंततः करता है, शायद मैं थोड़ा जुनूनी हूं लेकिन मुझे हमेशा अतिरिक्त क्षेत्र होने के लिए थोड़ा दर्द होता है। हालांकि अब जब मैं इसके बारे में सोचता हूं तो समस्या यह है कि एक बार जब आप एक कस्टम कार्यान्वयन कर रहे हैं तो अब कोई गारंटी नहीं है कि वास्तव में मूल्य कहां से आ रहा है। – EJoshuaS

1

आप ऐसा नहीं कर सकते हैं। आप या तो कस्टम गेटर सेटर्स (दोनों, सिंगल नहीं) का उपयोग करते हैं या आप ऑटो गेटर्स से चिपके रहते हैं।

अपनी संपत्ति के अपने कोड गेटर में ही की गेटर (जो एक ही गेटर और इतने पर और इतने पर उपयोग करने के लिए जा रहा है) का उपयोग करने की कोशिश कर रहा है

तो यह एक अंतहीन लूप जो सभी को नष्ट करने के लिए जा रहा है है दुनिया और मानवता का अंत लाएं

1

नहीं, यह संभव नहीं है। या तो आप इसे auto संपत्ति (या) getter और setter दोनों को परिभाषित करते हैं, इस मामले में आपको बैकिंग फ़ील्ड प्रदान करना होगा क्योंकि संकलक आपके लिए एक नहीं बनायेगा।

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