c#setter中的堆栈溢出异常

时间:2010-07-18 15:40:24

标签: c# setter callstack stack-overflow

这很容易解释: 这工作

using System;
using ConstraintSet = System.Collections.Generic.Dictionary<System.String, double>;

namespace ConsoleApplication2
{
    class test
    {
        public ConstraintSet a { get; set; }
        public test()
        {
            a = new ConstraintSet();
        }
        static void Main(string[] args)
        {
            test abc = new test();
            Console.WriteLine("done");
        }
    }
}

这不是

using System;
using ConstraintSet = System.Collections.Generic.Dictionary<System.String, double>;

namespace ConsoleApplication2
{
    class test
    {
        public ConstraintSet a { get { return a; } set { a = value; } }
        public test()
        {
            a = new ConstraintSet();
        }
        static void Main(string[] args)
        {
            test abc = new test();
            Console.WriteLine("done");
        }
    }
}

我在第二类的setter上得到了堆栈溢出异常,我不知道为什么。我不能使用第一种形式,因为统一引擎

不支持它

4 个答案:

答案 0 :(得分:34)

当您编写a = value时,您再次调用属性设置器。

要使用非自动属性,您需要创建一个单独的私有支持字段,如下所示:

ConstraintSet a;
public ConstraintSet A { get { return a; } set { a = value; } }

答案 1 :(得分:16)

您尚未声明支持变量 - 您刚刚获得了一个属性,其getter和setter会自行调用。我不清楚为什么 Unity不支持第一种形式 - 这意味着它可能也不会支持等价物,但基本上就是这样:

private ConstraintSet aValue;
public ConstraintSet a { get { return aValue; } set { aValue = value; } }

我当然通常会有一个更传统的名字 - 这意味着你可以在没有“价值”的情况下离开:

private ConstraintSet constraints;
public ConstraintSet Constraints
{
    get { return constraints; } 
    set { constraints = value; }
}

为了更详细地介绍当前第二种形式为什么抛出StackOverflowException,你应该永远记住属性基本上是伪装的方法。破碎的代码如下所示:

public ConstraintSet get_a()
{
    return get_a();
}

public void set_a(ConstraintSet value)
{
    set_a(value);
}

希望很明显为什么该版本正在吹嘘堆栈。修改后的版本只是设置一个变量,而不是再次调用该属性,所以在展开时它看起来像这样:

private ConstraintSet aValue;

public ConstraintSet get_a()
{
    return aValue;
}

public void set_a(ConstraintSet value)
{
    aValue = value;
}

答案 2 :(得分:4)

您不能在getter和setter中使用相同的变量名 这将导致它自己调用并最终堆栈溢出。递归过多。
你需要一个支持变量:

private ConstraintSet _a;
public ConstraintSet a { get { return _a; } set { _a = value; } }

答案 3 :(得分:3)

您的公共财产需要私有支持变量:

private ConstraintSet _a;
public ConstraintSet a { get { return _a; } set { _a = value; } }