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

我的程序调用 get 并进入 if 循环,然后无限运行到 set 代码

4

4 回答 4

16

该错误是因为在您的程序中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;
    }
}
于 2013-04-22T19:13:40.217 回答
5

使用成员变量或将其存储在会话中。

private int _position;
public int Position
{
    get
    {
        if (Session["Position"] != null)
        {
            _position= Convert.ToInt32(Session["Position"]);
        }
        else
        {
            _position= 5;
        }
        return _position;
    }
    set
    {
        _position = value;
    }
}
于 2013-04-22T19:13:44.797 回答
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
于 2013-04-22T20:01:51.857 回答
1

自动实现的属性属性由 getter、setter 和支持字段组成。如果您自己编写代码,则可能不需要字段。

你的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)为零。

于 2013-04-22T22:00:32.913 回答