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