我在属性设置器中进入无限循环
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)
为零。