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
答案 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)
为零。