2011-02-27 26 views
5

Zacząłem programowanie z C# kilka dni temu.Przeciążenie operatora powoduje przepełnienie stosu

Teraz pojawił się mylący błąd podczas gry z przeciążeniem operatora.

Poniższy kod tworzy StackOverflowException podczas uruchamiania:

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)); 
     } 
    } 
} 

starałem się napisać własny przykład po przeczytaniu rozdziału o operater przeciążenia z książki "Microsoft Visual C# 2008" od Dirk Louis i Shinja Strasser.

Może ktoś ma pojęcie, co jest nie tak.

Dzięki.

+0

gdzie pojawia się błąd? –

+0

Twój główny jest w klasie Operatorów, czy to coś, co chciałeś robić celowo? –

+0

Po prostu ciekawy ... dlaczego akceptowana odpowiedź zmienia się z mojej na ciekawską geekę? Ogólne zasady mają oznaczać pierwszą odpowiedź, która zapewnia akceptowalne rozwiązanie robocze. –

Odpowiedz

2

get code-blok w swojej klasie ma problemu i że jest przyczyną wyjątku StackOverFlow.

public string text 
    { 
     get 
     { 
      return text; 
     } 
    } 

Oto kiedy mówisz return text; to pójdzie i wywołać blok get właściwości text sam który powoduje przepełnienie stosu. zawijaj tekst właściwości wokół prywatnego pola łańcuchowego _txt i powinno działać poprawnie.

można zrobić to coś takiego ..

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

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

Po pierwsze przeciążenie operatora nie łamie kodu. Otrzymujesz StackOverflowException, ponieważ pobierający właściwość text próbuje się zwrócić.

Należy użyć pola podkład dla nieruchomości:

private string _text; 

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

Co .NET robi pod kołdrą jest przekształcić swoją nieruchomość do akcesor i mutator - dwie odrębne metody. W swojej pierwotnej przykład Twój kod będzie w następujący sposób:

private string text; 

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

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

Podczas gdy wersja poprawiona wykorzystuje pole oporowe odpowiednio:

private string text; 

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

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

Widzę mnóstwo przeciążenia operatora. Jednak masz rację w swojej odpowiedzi. –

+0

@Mike - Tak, nie przewijałem wystarczająco daleko. Whoopsy! –

+0

Och, dzięki. Jaka szkoda. :(Zbyt dużo linii kodu dzisiaj –

1

Problemem jest to, że powróci proprty tekst Itself trzeba mieć zabezpieczone lub prywatne variab le przechowywać resut:

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

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

Dzięki człowieku, problem rozwiązany. :) –

Powiązane problemy