2013-04-22 60 views
5
public int Position 
{ 
    get 
    { 
     if (Session["Position"] != null) 
     { 
      Position = Convert.ToInt32(Session["Position"]); 
     } 
     else 
     { 
      Position = 5; 
     } 
     return Position; 
    } 
    set 
    { 
     Position = value; 
    } 
} 

我的程序调用get和进入,如果循环,然后infitely运行到设定的代码我陷入无限循环中的属性设置

+0

@Knaģis有更正的代码,但为了进一步解释原因:将这些获取器和设置器视为功能,因为这就是它们在幕后。如果一个函数调用它自己,没有办法退出,你将处于一个无限循环。 – bland 2013-04-22 19:31:56

回答

13

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

你并不需要同时使用下划线和'this'。大多数人会发现下划线意味着你指的是当地成员,没有什么需要被消除。 – 2013-04-22 19:16:46

+0

下划线对于我(以及其他人)来说真的只是一个习惯问题,但在我看来(也是StyleCop http://stackoverflow.com/questions/1562540/why-does-stylecop-recommend-prefixing-method-或 - 财产 - 呼叫与此)'这个'应该是强制性的。 – 2013-04-22 19:18:59

+2

是的,StyleCop的错。 :)和该堆栈溢出问题[异议意见](http://stackoverflow.com/a/1562571/102937)。 – 2013-04-22 19:19:57

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

关于会话状态项没有什么特别的字符串。

你为什么不只要按照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 
+0

作为'int'? 'int'是值类型,它怎么可能是'as'? – 2013-04-22 21:36:39

+0

@KenKin:'int?'是'Nullable '的语法糖,它是一个引用类型(特殊的,用于引导)。直接的'int'会在会话存储中被装箱;一个'int?'是为了所有的意图和目的,已经装箱了。请参阅规范ISO 23270§14.9.11:* as运算符用于将值显式转换为给定的引用类型或可为空值的类型...当 转换为可为空类型时,as运算符使用包装转换,取消装箱转换或无效 类型转换(第13.7.1节)...如果指定的转换不可行,则结果值为空。* – 2013-04-22 21:46:26

+0

对不起。只是可读性问题.. – 2013-04-22 22:02:42

1

一个自动实现的属性财产包括一个getter,一个setter和一个后台如果你自己编写代码,可能不需要一个字段

你的getter调用setter,setter调用set之三;那将是无限递归。您可能需要一个字段来存储Position

但是,如果我们改变它与存储到一个字段,并且setter实际上不起作用。因此,该代码可改为:

public int Position { 
    set { 
    } 

    get { 
     int x; 
     return (x=Convert.ToInt32(Session["Position"]))>0?x:5; 
    } 
} 

你并不需要检查空,Convert.ToInt32(null)为零。