2012-06-03 44 views
-5

我的代码存在问题。我终于明白了,所以没有错误,但现在我必须处理stackoverflow ...C#中'StackOverflowException was unhandled'错误#

有人可以告诉我什么是我的代码错了吗?

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

这将是很好,如果你可以帮助!

感谢

+0

更多详细资料请...添加堆栈跟踪和代码 – eyossi

+7

它的其余部分是递归调用,投影调用投影。使用私人领域。鲁本的答案会奏效。 – Shyju

+0

仅供参考,generateFrustum()应根据.NET指南命名为GenerateFrustum():http://msdn.microsoft.com/en-us/library/ms229002.aspx –

回答

24

你一套方法调用本身:Projection = value

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

当您使用以下形式:

public Matrix Projection { get; set } 

你不需要指定变量来存储实际值,但是当你实现获取或设置明确的,你应该声明额外的变量,并用它获取,设置实现。

+14

为什么你给别人问了一个(简单)问题增加了一个赏金,而你回答(正确)? –

+0

也许有人会给出更好的答案或更多的解释,为什么在这两种情况下有不同的行为(只是“get; set”或执行get或set)。 – Ruben

+3

public T PropA {get;组; }是私人T的糖语法_PropA; public T PropA {get {return _PropA; } set {_PropA = value; }} –

4

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

get { return Projection; } 

等同于:

get { return get();}. 
4

属性getter和setter方法是这样实现的方法(get_X和set_X)。

在投影设置程序中写入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(); 
     } 
    } 
} 
相关问题