C#中的'StackOverflowException未处理'错误

时间:2012-06-03 13:49:47

标签: c# xna stack-overflow unhandled

我的代码有问题。我终于得到它所以没有错误,但现在我必须处理stackoverflow ...

有人可以告诉我我的代码有什么问题吗?

    public Matrix Projection
    {
        get { return Projection; }
        protected set 
        {
            Projection = value;
            generateFrustum();
        }
    }

如果你能帮忙的话会很好!

感谢

4 个答案:

答案 0 :(得分:24)

您的set方法自行调用:Projection = value

private Matrix _projection = null;
public Matrix Projection
{
    get { return _projection; }
    protected set 
    {
        _projection = value;
        generateFrustum();
    }
}

使用以下表格时:

public Matrix Projection { get; set }

您不需要指定变量来存储实际值,但是当您明确实现get或set时,您应该声明其他变量并在get,set implementation中使用它。

答案 1 :(得分:4)

您正在getset函数中定义无限递归。

get { return Projection; }

相当于:

get { return get();}.

答案 2 :(得分:4)

属性的setter和getter实现为方法(get_X和set_X)。

在Projection的设置器中编写Projection = value会导致从set_Projection()内对set_Projection()进行递归调用。 (这同样适用于get_Projection()。)

由于调用没有条件,递归是无限的。

对于public T PropA { get; set; },它是糖语法:

private T _PropA;

public T PropA
{
    get
    {
        return _PropA;
    }
    set
    {
        _PropA = value;
    }
}

你应该做的是:

private Matrix _projection;

public Matrix Projection
{
    get
    {
        return _projection;
    }
    protected set 
    {
        // Make sure that Matrix is a structure and not a class
        // override == and != operators in Matrix (and Equals and GetHashCode)
        // If Matrix has to be a class, use !_project.Equals(value) instead

        // Consider using an inaccurate compare here instead of == or Equals
        // so that calculation inaccuracies won't require recalculation

        if (_projection != value)
        {
            _projection = value;
            generateFrustum();
        }
    }
}

答案 3 :(得分:0)

public T PropA { get; set; } 

实际上是

的语法
T _PropA; public T PropA { get { return _PropA; } set { _PropA = value; } }

所以答案是

private Matrix _projection = null;
public Matrix Projection
{
    get { return _projection; }
    protected set 
    {
      _projection = value;
      generateFrustum();
    }
}

您可以参阅以下示例了解更多信息 http://msdn.microsoft.com/en-us/library/ms228503.aspx
http://msdn.microsoft.com/en-us/library/w86s7x04(v=vs.80).aspx