2011-02-27 45 views
5

Tôi bắt đầu lập trình với C# cách đây vài ngày.Quá tải nhà khai thác gây ra tràn ngăn xếp

Bây giờ, một lỗi gây nhầm lẫn phát sinh khi phát xung quanh với quá tải toán tử.

Các mã sau đây tạo ra một StackOverflowException khi chạy:

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

Tôi cố gắng để viết một ví dụ riêng sau khi đọc chương về operater quá tải từ cuốn sách "Microsoft Visual C# 2008" từ Dirk Louis và Shinja Strasser.

Có thể ai đó có manh mối về sự cố.

Cảm ơn.

+0

lỗi xảy ra ở đâu? –

+0

Main của bạn nằm trong lớp Operators, có phải là thứ bạn muốn thực hiện không? –

+0

Chỉ tò mò ... tại sao câu trả lời được chấp nhận thay đổi từ tôi thành đam mê của geek? Các quy tắc chung là đánh dấu câu trả lời đầu tiên cung cấp một giải pháp làm việc như được chấp nhận. –

Trả lời

2

Các get mã khối trong lớp học của bạn có vấn đề và điều đó là nguyên nhân gây ra ngoại lệ StackOverFlow.

public string text 
    { 
     get 
     { 
      return text; 
     } 
    } 

đây khi bạn nói return text; nó sẽ đi và gọi khối get của thuộc tính text chính nó mà gây ra stack tràn. bọc văn bản thuộc tính của bạn xung quanh một trường chuỗi _txt riêng và nó sẽ hoạt động đúng.

Bạn có thể làm cho nó một cái gì đó như thế này ..

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

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

Vâng, đối với một, toán tử quá tải không vi phạm mã của bạn. Bạn nhận được StackOverflowException vì trình dọn dẹp của thuộc tính text của bạn đang cố gắng tự trả lại.

Bạn nên sử dụng một lĩnh vực sao lưu cho tài sản của bạn:

private string _text; 

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

gì NET nào dưới bìa là chuyển đổi sở hữu của bạn thành một accessor và mutator - hai phương pháp riêng biệt. Trong ví dụ ban đầu của bạn, mã của bạn sẽ được làm như sau:

private string text; 

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

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

Trong khi phiên bản sửa chữa sử dụng các lĩnh vực sao lưu đúng cách:

private string text; 

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

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

Tôi thấy rất nhiều thao tác quá tải. Tuy nhiên, bạn đúng trong câu trả lời của bạn. –

+0

@Mike - Vâng, tôi đã không di chuyển xuống đủ xa. Rất tiếc! –

+0

Ồ, cảm ơn. Xấu hổ làm sao. :(Quá nhiều dòng mã hôm nay. –

1

Vấn đề là lợi nhuận văn bản proprty tự Bạn nên có một protected hay private variab le để lưu trữ các resut:

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

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

Cảm ơn người đàn ông. Đã giải quyết được vấn đề. :) –

Các vấn đề liên quan