getter / setter中的无限循环c#

时间:2013-05-22 14:13:04

标签: c#

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。鉴于大量的即时反应。现在我知道的更好。

5 个答案:

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