2012-03-21 15 views
9

wcfserviceLibrary.DLLसिस्टम। स्टैक ओवरफ्लो एक्सेप्शन, जब सेट प्रॉपर्टी का उपयोग किया जाता है?

इस प्रकार कोड दिखाया गया है, तो 'System.StackOverflowException' प्रकार का एक अनचाहे अपवाद हुआ।

[DataContract] 
public class memberdesignations 
{ 
    [DataMember] 
    public string DesigId 
    { 
     get { return DesigId; } 
     set { DesigId = value;} 
    } 
    [DataMember] 
    public string DesignationName 
    { 
     get { return DesignationName; } 
     set { DesignationName = value; } 
    } 

} 

तो मैं प्रकार memberdesignations की विधि के रूप में वर्ग प्राप्त सेट गुण युक्त त्रुटि मिल रही है इस प्रकार है

public List<memberdesignations> memberdesignations() 
    { 
     List<memberdesignations> designations = new List<memberdesignations>(); 
     memberdesignations objmemDesignations; 
     ds = objbll.Get_Member_Designations(); 
     DataView dv = new DataView(); 
     dv = ds.Tables[0].DefaultView; 
     foreach (DataRowView drow in dv) 
     { 
      objmemDesignations = new memberdesignations(); 
      objmemDesignations.DesigId = drow["DesignationId"].ToString(); 
      objmemDesignations.DesignationName = drow["DesignationName"].ToString(); 
      designations.Add(objmemDesignations); 
     } 
     return designations; 
    } 

iam है।

लेकिन मैं त्रुटि से छुटकारा पाने में सक्षम था जब मैं इस तरह वर्ग संशोधित:

[DataContract] 
public class memberdesignations 
{ 
    [DataMember] 
    public string DesigId 
    { 
     get; set; 
    } 
    [DataMember] 
    public string DesignationName 
    { 
     get; set; 
    } 
} 

मंच खोज पर, मैं कारण नहीं पाया के लिए यह था और Konamiman द्वारा here

समझाया

मैं Konamiman

या किसी अन्य स्पष्टीकरण की सराहना की गई संपत्तियों के दो अलग-अलग तरीकों के बीच अंतर जानना चाहता हूं।

धन्यवाद

+0

आपको नीचे एक उत्तर स्वीकार करना चाहिए। –

+0

@Valamas मैंने जवाब स्वीकार कर लिया, मुझे याद दिलाने के लिए धन्यवाद। – Mourya

उत्तर

24

मुद्दा यह है कि, कोनामीमान ने कहा, आप एक संपत्ति को दोबारा बुला रहे हैं।

मान लें कि मेरे पास एक स्ट्रिंग प्रॉपर्टी "DesignationName" है।

public string DesignationName 
{ 
    //Some getter to return some data 
    //Some setter to set the data 
} 

आप इसे वापस करने की अपेक्षा करेंगे? एक हार्ड-कोडित स्ट्रिंग _designationName लौटने के बारे में कैसे;

private string _designationName = "someName"; 
public string DesignationName 
{ 
    get {return _designationName;} 
    //Some setter to set the data 
} 

यह काम करता है। लेकिन अगर मैं इसे वापस लौटा दूंगा तो क्या होगा?

public string DesignationName 
{ 
    get {return DesignatioName;} 
    //Some setter to set the data 
} 

खैर, यह DesignationName, जो अपने आप फिर से बुला रखना होगा, जो फिर से DesignationName ... इतने पर कहेंगे और बुला रखना होगा। यह सब ढेर पर डेटा डालता है, और ढेर के लिए आवंटित स्थान को ओवररन्स होने तक हमेशा के लिए चला जाता है। वोला, एक स्टैक ओवरफ्लो।

आपका आखिरी उदाहरण काम करने का कारण यह है क्योंकि यह 'ऑटोप्रोपर्टी' कहलाता है, जो .NET 3.0 के लिए एक नई सुविधा है। असल में, पर्दे के पीछे, यह समर्थन क्षेत्रों अपनी प्रॉपर्टी के लिए पैदा कर रही है तो यह है कि:

public string DesignationName 
{ 
    get; 
    set; 
} 

वास्तव में इस तरह व्यवहार करने के लिए संकलित:

private string _designationName = string.Empty; 
public string DesignationName 
{ 
    get { return _designationName; } 
    set { _designationName = value; } 
} 
+0

त्रुटि का मुख्य कारण समझ गया है ऑटो-कार्यान्वित गुण सी # 3.0 की एक विशेषता थी :) –

+0

@ किल्लिन, इसलिए मैं बस प्राप्त कर सकता हूं; सेट;। स्पष्टीकरण के लिए धन्यवाद। – Mourya

+0

यहां पोस्ट किए गए सभी उत्तरों को संदर्भित करने के बाद, मैंने एमएसडीएन आलेख का दौरा किया जिसमें संपत्तियों के बारे में विस्तृत स्पष्टीकरण है। लिंक [यहां] पर जाएं (http://msdn.microsoft.com/en-us/library/w86s7x04.aspx) – Mourya

3

आप (अपने ढेर अतिप्रवाह जब तक अधिक बार बार)

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

+0

स्पष्टीकरण के लिए धन्यवाद, अब मुझे त्रुटि – Mourya

4

दोनों के लिए निजी चर घोषित: _desigId, _designationName।आप एक रिकर्सिव-लूप में हैं जो अनन्तकाल पर चलेगा। गुणों की बजाय निजी चर वापस करें।

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