2013-04-22 71 views
5
public int Position 
{ 
    get 
    { 
     if (Session["Position"] != null) 
     { 
      Position = Convert.ToInt32(Session["Position"]); 
     } 
     else 
     { 
      Position = 5; 
     } 
     return Position; 
    } 
    set 
    { 
     Position = value; 
    } 
} 

我的程序調用get和進入,如果循環,然後infitely運行到設定的代碼我陷入無限循環中的屬性設置

+0

@Knaģis有更正的代碼,但爲了進一步解釋原因:將這些獲取器和設置器視爲功能,因爲這就是它們在幕後。如果一個函數調用它自己,沒有辦法退出,你將處於一個無限循環。 – bland 2013-04-22 19:31:56

回答

13

的錯誤是因爲在你set {}你遞歸調用同一個二傳手。

正確的代碼將

private int _position; 
public int Position 
{ 
    get 
    { 
     if (Session["Position"] != null) 
     { 
      this._position = Convert.ToInt32(Session["Position"]); 
     } 
     else 
     { 
      this._position = 5; 
     } 
     return this._position; 
    } 
    set 
    { 
     this._position = value; 
    } 
} 
+3

你並不需要同時使用下劃線和'this'。大多數人會發現下劃線意味着你指的是當地成員,沒有什麼需要被消除。 – 2013-04-22 19:16:46

+0

下劃線對於我(以及其他人)來說真的只是一個習慣問題,但在我看來(也是StyleCop http://stackoverflow.com/questions/1562540/why-does-stylecop-recommend-prefixing-method-或 - 財產 - 呼叫與此)'這個'應該是強制性的。 – 2013-04-22 19:18:59

+2

是的,StyleCop的錯。 :)和該堆棧溢出問題[異議意見](http://stackoverflow.com/a/1562571/102937)。 – 2013-04-22 19:19:57

4

使用一個成員變量或者是將其存儲在會話中。

private int _position; 
public int Position 
{ 
    get 
    { 
     if (Session["Position"] != null) 
     { 
      _position= Convert.ToInt32(Session["Position"]); 
     } 
     else 
     { 
      _position= 5; 
     } 
     return _position; 
    } 
    set 
    { 
     _position = value; 
    } 
} 
2

關於會話狀態項沒有什麼特別的字符串。

你爲什麼不只要按照KISS原則,並完成類似

public int Position 
{ 
    get { return (int) (Session["Position"] ?? 5) ; } 
    set { Session["Position"] = value ;    } 
} 

或(根據您的實際要求/規格:

public int Position 
{ 
    get { return Session["Pointer"] as int? ?? position ?? 5 ; } 
    set { position = value ; } 
} 
private int? position ; // backing store 
+0

作爲'int'? 'int'是值類型,它怎麼可能是'as'? – 2013-04-22 21:36:39

+0

@KenKin:'int?'是'Nullable '的語法糖,它是一個引用類型(特殊的,用於引導)。直接的'int'會在會話存儲中被裝箱;一個'int?'是爲了所有的意圖和目的,已經裝箱了。請參閱規範ISO 23270§14.9.11:* as運算符用於將值顯式轉換爲給定的引用類型或可爲空值的類型...當 轉換爲可爲空類型時,as運算符使用包裝轉換,取消裝箱轉換或無效 類型轉換(第13.7.1節)...如果指定的轉換不可行,則結果值爲空。* – 2013-04-22 21:46:26

+0

對不起。只是可讀性問題.. – 2013-04-22 22:02:42

1

一個自動實現的屬性財產包括一個getter,一個setter和一個後臺如果你自己編寫代碼,可能不需要一個字段

你的getter調用setter,setter調用set之三;那將是無限遞歸。您可能需要一個字段來存儲Position

但是,如果我們改變它與存儲到一個字段,並且setter實際上不起作用。因此,該代碼可改爲:

public int Position { 
    set { 
    } 

    get { 
     int x; 
     return (x=Convert.ToInt32(Session["Position"]))>0?x:5; 
    } 
} 

你並不需要檢查空,Convert.ToInt32(null)爲零。