2017-01-14 223 views
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 

{ 
    class Test 
    { 
     private int myFaveNumber; //fields 
     private const int myLeastFaveNumber = 5; 
     private string secretPassword = "Pickle"; 

     public int MyFaveNumber 
     { 
      get 
      { 
       return MyFaveNumber; 
      } 
      set 
      { 
       if (value > 0) 
        MyFaveNumber = value; 
       else 
        myFaveNumber = 10; 

      } 
     } 

     public int Math() 
     { 
      return myFaveNumber - myLeastFaveNumber; 
     } 

     public Test() 
     { 
      Console.WriteLine("Secret password is " + secretPassword); 

     } 
     public Test(string two) 
     { 
      Console.WriteLine("The full password is {0}", two); 
     } 






    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Test quick = new Test(); 
      Console.WriteLine(quick.ToString()); 
      quick.MyFaveNumber = 5; 
      Console.WriteLine(quick.Math()); 


      Test quicky = new Test("Drill"); 
      Console.ReadKey(); 


     } 
    } 
} 

我正在搞乱作为一个初学者,我想知道为什么我得到一个“由于StackOverflowException终止进程”。如果你能帮我弄清楚这将是非常好的。也欢迎任何提示。为什么我会得到这个StackOverFlowException

回答

0

应当myFaveNumberMyFaveNumber =值;

set 
{ 
    if (value > 0) 
     myFaveNumber = value; 
    else 
     myFaveNumber = 10; 
} 
0

的问题是在这个部分:

public int MyFaveNumber 
{ 
    get 
    { 
     return MyFaveNumber; 
    } 

    ... 
} 

你已经设置MyFaveNumber属性返回本身。同样,在二传手:

set 
{ 
    if (value > 0) 
     MyFaveNumber = value; 
    else 
     myFaveNumber = 10; 

} 

你(有条件)分配MyFaveNumber,导致二传手调用自身。这两种方案都会导致属性一次又一次地递归调用其getter/setter,直到程序崩溃。

您需要越来越/设置私人支持字段myFaveNumber代替:

public int MyFaveNumber 
{ 
    get 
    { 
     return myFaveNumber; 
    } 
    set 
    { 
     if (value > 0) 
      myFaveNumber = value; 
     else 
      myFaveNumber = 10; 
    } 
} 
0

考虑财产的功能。
当你写这个功能

你会清楚地认识,有可能在无限递归调用,将“炸毁”您的堆栈(堆栈.NET应用程序的默认大小为1 MB)。所以,当你执行的时候,你在程序中发生的每次递归调用都会增加栈的大小。

quick.MyFaveNumber = 5; 

,你会得到的情况下,同样的异常时,你会试图读取属性的值使用属性值分配给下层专用领域的

Console.WriteLine(quick.MyFaveNumber); 

所以正确的方法时需要验证完成。

private int _myProperty; 
public int MyProperty 
{ 

}