我在属性设置器中进入无限循环

时间:2013-04-22 19:12:09

标签: c# asp.net properties 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 code

4 个答案:

答案 0 :(得分:13)

错误是因为在你的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;
    }
}

答案 1 :(得分: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 :(得分: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

答案 3 :(得分:1)

自动实现的属性属性由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;
    }
}

您无需检查空值,Convert.ToInt32(null)为零。