6
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。鉴于众多即时响应。现在我知道得更清楚了。

4

5 回答 5

18

您有一个无限递归,因为您指的是属性的属性。

您应该为此使用支持字段:

private int testCount;
public int TestCount
{
    get { return testCount; }
    set { testCount = value + 13; }
}

请注意属性名称TestCount(也符合 C# 命名标准),而不是字段名称testCount(小写t)。

于 2013-05-22T14:14:42.723 回答
5

您应该声明一个变量来支持该属性:

class something
{
    private int _testCount;
    public int testCount
    {
        get { return _testCount; }
        set { _testCount = value + 13; }
    }
    ...
于 2013-05-22T14:14:49.823 回答
3

您在属性的 getter 中有一个循环引用。尝试这个:

class Something
{
    private int _testCount;
    public int TestCount
    {
        get { return _testCount; }
        set { _testCount = value; }
    }

    public void DoIt(int val)
    {
        _testCount = val;
    }
}
于 2013-05-22T14:15:12.350 回答
2

这个:

public int testCount
{
    get { return testCount; }

它返回自己,这导致它自己执行。

与其返回自己的属性,不如将预期的值存储在另一个(最好是受保护的或私有的)变量中。然后在 setter 和 getter 中操作该变量。

于 2013-05-22T14:14:50.897 回答
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;
    }
}
于 2013-05-22T14:15:01.657 回答