2011-02-27 30 views
5

का कारण बनता है मैंने कुछ दिन पहले सी # के साथ प्रोग्रामिंग शुरू की थी।ऑपरेटर अधिभार एक स्टैक ओवरफ़्लो

अब ऑपरेटर अधिभार के साथ खेलते समय एक भ्रमित त्रुटि उत्पन्न हुई।

using System; 

namespace OperatorOverloading 
{ 
    public class Operators 
    { 
     // Properties 
     public string text 
     { 
      get 
      { 
       return text; 
      } 

      set 
      { 
       if(value != null) 
        text = value; 
       else 
        text = ""; 
      } 
     } 

     // Constructors 
     public Operators() : this("") 
     { 
     } 

     public Operators(string text) 
     { 
      // Use "set" property. 
      this.text = text; 
     } 

     // Methods 
     public override string ToString() 
     { 
      return text; 
     } 

     // Operator Overloading 
     public static string operator +(Operators lhs, Operators rhs) 
     { 
      // Uses properties of the passed arguments. 
      return lhs.text + rhs.text; 
     } 

     public static void Main(string[] args) 
     { 
      Operators o1 = new Operators(); 
      Operators o2 = new Operators("a"); 
      Operators o3 = new Operators("b"); 

      Console.WriteLine("o1: " + o1); 
      Console.WriteLine("o2: " + o2); 
      Console.WriteLine("o3: " + o3); 

      Console.WriteLine(); 

      Console.WriteLine("o1 + o2: " + (o1 + o2)); 
      Console.WriteLine("o2 + o3: " + (o2 + o3)); 
     } 
    } 
} 

मैं पुस्तक "माइक्रोसॉफ्ट विजुअल C# 2008" डिर्क लुइस और Shinja से अधिक भार से operater के बारे में अध्याय को पढ़ने के बाद एक अपना उदाहरण देते लिखने का प्रयास किया:

निम्नलिखित कोड एक StackOverflowException जब चल रहा है का उत्पादन Strasser।

शायद किसी के पास कोई संकेत है कि क्या गलत हो रहा है।

धन्यवाद।

+0

त्रुटि कहां होती है? –

+0

आपका मुख्य ऑपरेटर क्लास के अंदर है, क्या आप उद्देश्य पर कुछ करना चाहते हैं? –

+0

बस उत्सुक ... क्यों स्वीकार्य उत्तर मेरा उत्सुक गीक से बदलता है? सामान्य नियम पहले उत्तर को चिह्नित करना है जो एक कार्य समाधान को स्वीकार किए जाते हैं। –

उत्तर

2

अपनी कक्षा में प्राप्त कोड ब्लॉक समस्या और है कि अपने मूल उदाहरण में, अपने कोड का पालन कर रहे होते StackOverFlow अपवाद का कारण क्या है।

public string text 
    { 
     get 
     { 
      return text; 
     } 
    } 

यहाँ जब आप कहते हैं return text; यह जाने के लिए और संपत्ति text ही जो ढेर-अतिप्रवाह खड़ी कर रहा है के ब्लॉक प्राप्त कॉल करेंगे। अपनी संपत्ति टेक्स्ट को एक निजी _txt स्ट्रिंग फ़ील्ड के चारों ओर लपेटें और इसे ठीक से काम करना चाहिए।

आप यह कुछ इस तरह बना सकते हैं ..

private string _txt; 
public string text 
{ 
    get 
    { 
     return _txt; 
    } 

    set 
    { 
     _txt = string.IsNullOrEmpty(value) ? string.Empty : value; 
    } 
} 
10

ठीक है, एक के लिए, ऑपरेटर अधिभार आपके कोड को तोड़ नहीं रहा है। आपको StackOverflowException मिलता है क्योंकि आपकी text संपत्ति का गेटटर खुद को वापस करने का प्रयास कर रहा है।

आप अपनी संपत्ति के लिए एक समर्थन क्षेत्र का उपयोग करना चाहिए:

private string _text; 

public string Text 
{ 
    get { return _text; } 
    set 
    { 
     if (value != null) 
      _text = value; 
     else 
      _text = string.Empty; 
    } 
} 

क्या नेट कवर के तहत करता एक्सेसर और एक mutator में अपनी संपत्ति कन्वर्ट है - दो अलग-अलग तरीकों। जबकि सही संस्करण ठीक से समर्थन क्षेत्र का उपयोग करता

private string text; 

public string get_text() 
{ 
    return get_text(); // <-- StackOverflowException 
} 

public void set_text(string value) 
{ 
    this.text = value; 
} 

:

private string text; 

public string get_text() 
{ 
    return this.text; // Happy :) 
} 

public void set_text(string value) 
{ 
    this.text = value; 
} 
+1

मैं ऑपरेटर ओवरलोडिंग के बहुत सारे देखता हूं। हालांकि, आप अपने उत्तर में सही हैं। –

+0

@ माइक - हाँ, मैंने काफी नीचे स्क्रॉल नहीं किया था। Whoopsy! –

+0

ओह, धन्यवाद। कितनी शर्म की बात है। :(आज कोड की बहुत अधिक पंक्तियां। –

1
समस्या

कि पाठ proprty रिटर्न ही आप किसी सुरक्षित किया जाना चाहिए था या निजी variab le resut स्टोर करने के लिए है:

// Properties 
    private string _text 
    public string text 
    { 
     get 
     { 
      return _text; 
     } 

     set 
     { 
      if(value != null) 
       _text = value; 
      else 
       _text = ""; 
     } 
    } 
+0

धन्यवाद आदमी। समस्या हल हो गई। :) –

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