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

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