2013-04-22 12 views
5
public int Position 
{ 
    get 
    { 
     if (Session["Position"] != null) 
     { 
      Position = Convert.ToInt32(Session["Position"]); 
     } 
     else 
     { 
      Position = 5; 
     } 
     return Position; 
    } 
    set 
    { 
     Position = value; 
    } 
} 

मेरा कार्यक्रम प्राप्त कॉल करता है और अगर पाश में चला जाता है और फिर सेट कोड में infitely चलाता संपत्ति सेटर में अनंत लूप में हो रही हैमैं

+0

@ कन्निस के पास सही कोड है, लेकिन आगे यह बताने के लिए कि क्यों: इन गेटर्स और सेटर्स को कार्यों के रूप में सोचें क्योंकि वे दृश्यों के पीछे हैं। यदि कोई फ़ंक्शन स्वयं को बाहर निकलने के साधन के बिना कॉल करता है, तो आप अनंत लूप में होंगे। – bland

उत्तर

13

त्रुटि है क्योंकि अपनी set {} आप रिकर्सिवली ही सेटर लागू कर रहे हैं ।

सही कोड होगा

private int _position; 
public int Position 
{ 
    get 
    { 
     if (Session["Position"] != null) 
     { 
      this._position = Convert.ToInt32(Session["Position"]); 
     } 
     else 
     { 
      this._position = 5; 
     } 
     return this._position; 
    } 
    set 
    { 
     this._position = value; 
    } 
} 
+3

आपको वास्तव में अंडरस्कोर और 'यह' एक ही समय की आवश्यकता नहीं है। अधिकांश लोगों को पता चलेगा कि अंडरस्कोर का मतलब है कि आप स्थानीय सदस्य का जिक्र कर रहे हैं, और ऐसा कुछ भी नहीं है जिसे असंबद्ध करने की आवश्यकता है। –

+0

अंडरस्कोर वास्तव में मेरे लिए आदत का विषय है (और कई अन्य), लेकिन मेरी राय में (और स्टाइलकॉप http://stackoverflow.com/questions/1562540/why-does-stylecop-recommend-prefixing-method- या संपत्ति-कॉल-साथ-साथ) 'यह' हमेशा अनिवार्य होना चाहिए। –

+2

हाँ, स्टाइलकॉप गलत है। :) और उस स्टैक ओवरफ्लो प्रश्न में [असंतोषजनक राय] है (http://stackoverflow.com/a/1562571/102937)। –

4

एक सदस्य चर का प्रयोग करें या शायद सत्र में संग्रहीत।

private int _position; 
public int Position 
{ 
    get 
    { 
     if (Session["Position"] != null) 
     { 
      _position= Convert.ToInt32(Session["Position"]); 
     } 
     else 
     { 
      _position= 5; 
     } 
     return _position; 
    } 
    set 
    { 
     _position = value; 
    } 
} 
2

विशेष रूप से स्ट्रिंग की तरह सत्र स्थिति वस्तुओं के बारे में कुछ भी नहीं है।

आप क्यों नहीं बस KISS सिद्धांत का पालन होता नहीं और

public int Position 
{ 
    get { return (int) (Session["Position"] ?? 5) ; } 
    set { Session["Position"] = value ;    } 
} 

या की तरह कुछ करना (आपका वास्तविक आवश्यकताओं/चश्मा पर निर्भर करता है:

public int Position 
{ 
    get { return Session["Pointer"] as int? ?? position ?? 5 ; } 
    set { position = value ; } 
} 
private int? position ; // backing store 
+0

'int' के रूप में? 'int' मान प्रकार है, यह' as' कैसे हो सकता है? –

+0

@ केनकिन: 'int?' 'Nullable ' के लिए वाक्य रचनात्मक चीनी है, एक संदर्भ प्रकार (और बूट करने के लिए विशेष)। सत्र स्टोर में सीधे 'int' बॉक्स किया जाएगा; एक 'int?' सभी उद्देश्यों और उद्देश्यों के लिए है, पहले से ही बॉक्स किया गया है। Spec देखें, आईएसओ 23270 § 14.9.11: * ऑपरेटर के रूप में किसी मान को किसी दिए गए संदर्भ प्रकार या शून्य प्रकार में स्पष्ट रूप से रूपांतरित करने के लिए उपयोग किया जाता है ... जब एक शून्य प्रकार में कनवर्ट करना, ऑपरेटर एक रैपिंग रूपांतरण का उपयोग करता है, एक अनबॉक्सिंग रूपांतरण, या एक शून्य प्रकार रूपांतरण (§13.7.1) ... यदि संकेतित रूपांतरण संभव नहीं है, तो परिणामी मान शून्य है। * –

+0

क्षमा करें .. बस एक पठनीयता समस्या .. –

1

एक स्वत: लागू किया संपत्ति संपत्ति के होते हैं एक गेटर, एक सेटर और बैकिंग फ़ील्ड। यदि आप स्वयं कोड लिखते हैं, तो एक फ़ील्ड आवश्यक नहीं हो सकता है।

आपका गेटर सेटटर का आह्वान करता है, और सेटटर सेट को आमंत्रित करता है Ter; वह अनंत रिकर्सन होगा। आपको Position स्टोर करने के लिए फ़ील्ड की आवश्यकता हो सकती है।

हालांकि, अगर हम इसे किसी फ़ील्ड में संग्रहीत करने के साथ बदलते हैं, और वास्तव में सेटटर प्रभावी नहीं होता है। तो, कोड को बदला जा सकता है:

public int Position { 
    set { 
    } 

    get { 
     int x; 
     return (x=Convert.ToInt32(Session["Position"]))>0?x:5; 
    } 
} 

आप अशक्त के लिए जाँच करने की जरूरत नहीं है, Convert.ToInt32(null) शून्य है।