C# C中的“StackOverflowException未处理”错误

C# C中的“StackOverflowException未处理”错误,c#,xna,stack-overflow,unhandled,C#,Xna,Stack Overflow,Unhandled,我的代码有问题。我终于得到了它,所以没有错误,但现在我必须处理stackoverflow 有人能告诉我我的代码有什么问题吗 public Matrix Projection { get { return Projection; } protected set { Projection = value; generateFrustum(); } } 如果你能帮

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

有人能告诉我我的代码有什么问题吗

    public Matrix Projection
    {
        get { return Projection; }
        protected set 
        {
            Projection = value;
            generateFrustum();
        }
    }
如果你能帮忙,那就太好了


谢谢

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

使用以下表格时:

public Matrix Projection { get; set }

您不需要指定变量来存储实际值,但是当您显式实现get或set时,您应该声明额外的变量并在get、set实现中使用它。

您在get和set函数上定义了无限递归

get { return Projection; }
相当于:

get { return get();}.
实际上是

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();
    }
}
有关更多信息,请参阅下面的示例

属性的setter和getter被实现为方法get\u X和set\u X

在投影的setter中写入Projection=value,会导致从set_Projection中递归调用set_Projection。这同样适用于get_投影

由于调用周围没有条件,因此递归是无限的

对于公共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();
        }
    }
}

更多详情请。。。添加堆栈跟踪和代码的其余部分。这是一个递归调用,投影调用投影。使用私有字段。鲁本的答案行得通。仅供参考,generateFrustum应根据.NET指南命名为generateFrustum:@Nate注意对您的问题的评论,并为每个问题选择一个答案。似乎你的大多数问题都因为质量不高而被否决,你没有选择一个答案,也没有投票支持任何答案。为什么你要在一个简单的问题上加上悬赏,而其他人问了这个问题,而你的回答是正确的?也许有人会给出更好的答案或更多的解释,说明为什么这两种情况下会有不同的行为只是得到;set或带有get或set的实现。public T PropA{get;set;}是私有T_PropA;public T PropA{get{return{u PropA;}set{u PropA=value;}}@DannyVarod将其写在一个答案中,以收集您的赏金。@jonnyGold完成。还添加了有关setter中计算的其他提示。
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();
        }
    }
}