2011-02-27 5 views
5

며칠 전 C#으로 프로그래밍을 시작했습니다.연산자 오버로드로 인해 스택 오버플로가 발생합니다.

이제 연산자 오버로딩으로 놀 때 혼란스러운 오류가 발생했습니다.

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

내가 더크 루이스와 Shinja에서 책 "에서는 Microsoft Visual C# 2008"에서 오버로드 OPERATOR 시스템에 대한 장을 읽은 후 자신의 예를 작성했습니다 : 실행할 때

다음 코드는 있는 StackOverflowException을 생산 Strasser.

어쩌면 누군가가 잘못 될지 알 수 있습니다.

감사합니다.

+0

을 오류는 어디에서 발생합니까? –

+0

당신의 Main은 Operators 클래스 안에 있습니다. 당신이 의도적으로하고 싶은 것입니까? –

+0

그냥 궁금해서 ... 왜 받아 들여지는 대답이 광산에서 호기심 많은 괴짜로 바뀌 었습니까? 일반적인 규칙은 올바른 해결책을 제공 한 첫 번째 답변을 승인하는 것입니다. –

답변

2

클래스에서 Get 코드 블록 문제와 그것을 가지고 원래의 예에서, 코드는 다음을 수행 할 것 StackOverFlow 예외의 원인입니다. 여기

public string text 
    { 
     get 
     { 
      return text; 
     } 
    } 

당신은 가서 재산 스택 오버 플로우를 일으키는 text 자체의 GET 블록을 호출합니다 return text;을 말할 때. 개인 _txt 문자열 필드 주위에 속성 텍스트를 래핑하면 올바르게 작동합니다.

당신은이 같은 것을 할 수 있습니다 ..

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

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

음, 연산자 오버로딩이 코드를 손상시키지 않습니다. text 속성의 getter가 자체를 반환하려고하기 때문에 StackOverflowException이 표시됩니다.

당신은 당신의 재산에 대한지지 필드를 사용한다 :

private string _text; 

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

은 무엇 .NET은 내부적으로 수행하는 것은 접근과 뮤 테이터로 속성을 변환입니다 - 두 개의 분리 방법. 수정 된 버전은 제대로 백업 필드를 사용하는 반면

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

@Mike - 네, 충분히 멀리 아래로 스크롤하지 않았습니다. 부러워! –

+0

오, 고마워. 참으로 수치 스럽다. :(오늘 코드가 너무 많습니다.) –

1

문제를 당신은 보호 또는 르 variab 개인해야 텍스트하게 proprty 반환 자체가 resut 저장하는 것입니다 :

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

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

감사합니다. 문제가 해결되었습니다. :) –

관련 문제