C# C中的“StackOverflowException未处理”错误
我的代码有问题。我终于得到了它,所以没有错误,但现在我必须处理stackoverflow 有人能告诉我我的代码有什么问题吗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(); } } 如果你能帮
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();
}
}
}