簡體   English   中英

我在屬性設置器中進入無限循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM