为什么我得到这个StackOverFlowException

时间:2017-01-14 06:30:08

标签: c#

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而导致进程终止"。如果你能帮我解决这个问题,那就太好了。此外,欢迎任何提示。

3 个答案:

答案 0 :(得分:0)

应该 myFaveNumber 而不是 MyFaveNumber =值;

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

答案 1 :(得分:0)

问题出在这一部分:

public int MyFaveNumber
{
    get
    {
        return MyFaveNumber;
    }

    ...
}

您已将MyFaveNumber属性设置为自行返回。同样,在setter中:

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

答案 2 :(得分:0)

将财产视为一种功能 当你写这个函数时

public int GetMyProperty()
{
    return GetMyProperty();
}

public void SetMyProperty(int value)
{
    if (value > 0)
        SetMyProperty(value);
}

你很明显会发现无限递归调用有可能“炸毁”你的堆栈(.NET应用程序的默认堆栈大小是1 MB)。因此,当您执行时,程序中发生的每次递归调用都会增加堆栈的大小。

quick.MyFaveNumber = 5;

如果您尝试读取属性值

,您将获得相同的异常
Console.WriteLine(quick.MyFaveNumber);

在完成所需的验证时,使用属性的正确方法将值分配给基础私有字段。

private int _myProperty;
public int MyProperty
{

}