class Program
{
static void Main(string[] args)
{
something s = new something();
s.DoIt(10);
Console.Write(s.testCount);
}
}
class something
{
public int testCount
{
get { return testCount; }
set { testCount = value + 13; }
}
public void DoIt(int val)
{
testCount = val;
}
}
我拥有的是什么,因为我想要测试和玩C#的getter / setter东西。但是,我得到一个StackOverFlowException未处理“set {testCount = value + 13}”。我无法单步执行它,因为我得到一个“调试器无法继续运行进程。进程已终止”来自Visual Studio的消息。我有什么想法吗?
编辑:今天我了解到我做了一个非常愚蠢的derp。鉴于大量的即时反应。现在我知道的更好。
答案 0 :(得分:17)
您有一个无限递归,因为您在属性中指的是属性。
您应该使用支持字段:
private int testCount;
public int TestCount
{
get { return testCount; }
set { testCount = value + 13; }
}
请注意属性名称TestCount
(也符合C#命名标准),而不是字段名testCount
(小写t
)。
答案 1 :(得分:4)
您应该声明一个变量来支持该属性:
class something
{
private int _testCount;
public int testCount
{
get { return _testCount; }
set { _testCount = value + 13; }
}
...
答案 2 :(得分:3)
您在物业的吸气器中有一个循环参考。试试这个:
class Something
{
private int _testCount;
public int TestCount
{
get { return _testCount; }
set { _testCount = value; }
}
public void DoIt(int val)
{
_testCount = val;
}
}
答案 3 :(得分:2)
此:
public int testCount
{
get { return testCount; }
它返回自身,导致它自己执行。
不是自己返回自己的属性,而是将目标值存储在另一个(最好是受保护的或私有的)变量中。然后在setter和getter中操作该变量。
答案 4 :(得分:1)
class Program
{
static void Main(string[] args)
{
something s = new something();
s.DoIt(10);
Console.Write(s.testCount);
}
}
class something
{
private int _testCount;
public int testCount
{
// you are calling the property within the property which would be why you have a stack overflow.
get { return _testCount; }
set { _testCount = value + 13; }
}
public void DoIt(int val)
{
testCount = val;
}
}