2017-01-14 5 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

myFaveNumberないMyFaveNumber =値であるべきです。

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

問題は、この部分にある:あなたは自分自身を返すようにMyFaveNumberプロパティを設定した

public int MyFaveNumber 
{ 
    get 
    { 
     return 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 
{ 

} 
関連する問題