2012-06-03 61 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(); 
     } 
    } 
} 
相關問題