[英]I am getting into infinite loop in property setter
public int Position
{
get
{
if (Session["Position"] != null)
{
Position = Convert.ToInt32(Session["Position"]);
}
else
{
Position = 5;
}
return Position;
}
set
{
Position = value;
}
}
我的程序調用get並進入if循環,然后無限運行到set代碼中
錯誤是因為在你的set {}
你以遞歸方式調用相同的setter。
正確的代碼將是
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;
}
}
使用成員變量或將其存儲在會話中。
private int _position;
public int Position
{
get
{
if (Session["Position"] != null)
{
_position= Convert.ToInt32(Session["Position"]);
}
else
{
_position= 5;
}
return _position;
}
set
{
_position = value;
}
}
關於會話狀態項沒有特別類似字符串的東西。
為什么你不遵循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
自動實現的屬性屬性包括getter,setter和backing字段。 如果您自己編寫代碼,則可能不需要字段。
你的getter調用setter,setter調用setter; 這將是無限遞歸。 您可能需要一個用於存儲Position
的字段。
但是,如果我們通過存儲到字段來更改它,並且實際上setter不起作用。 因此,代碼可以更改為:
public int Position {
set {
}
get {
int x;
return (x=Convert.ToInt32(Session["Position"]))>0?x:5;
}
}
您不需要檢查null, Convert.ToInt32(null)
為零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.