2010-10-26 41 views
14

如果我有一个具有用户加载特定页面时设置的静态属性的类,那么该用户会话唯一的静态值是什么?静态属性如何在asp.net环境中工作?

换句话说,如果第二个用户然后加载页面并设置静态属性,那么每个用户都有一个不同的值,或者都将使用第二个用户值?

+1

你看过的文档,或者尝试了一下自己呢? – 2012-07-19 23:13:00

回答

13

静态对于应用程序域是唯一的,该应用程序域的所有用户将为每个静态属性共享相同的值。当你看到“静态”这个词时,请考虑“这里只有一个实例。”实例持续多久是一个单独的问题,但简短的答案是它是可变的。

如果您想存储特定于用户的值,请查看Session State

1

不,没什么特别的,只是因为它是asp.net。 ASP.NET本身只是一个普通的.NET程序集合。如果你想保存每个会话的东西,那么你应该使用会话状态。如果没有,请小心,因为有很多线程可以访问您的静态数据。您应该阅读并了解线程,锁和竞赛条件如何协同工作。

2

静态字段和属性在类的所有实例中共享。所有用户最终都会分享相同的价值。

直到ASP.NET工作进程自行回收(定期发生),值才会在那里。

+0

+1 - 我得到了一次,愚蠢地去除了静态属性的赋值逻辑。这个价值已经停留了足够长的时间,让我几乎忘记了这一点,并且当游泳池*实际上回收利用时,有一个干草日解开了混乱。故事的道德:在任何情况下都要注意静态,但尤其是在ASP.NET中。 – Dan 2013-03-10 01:10:43

2

除了鲍勃的回答,有这种例外,当然:

public static object Item { 
    get { return HttpContext.Current.Session["some_key"]; } 
} 
+0

还有很多:例如'HttpContext.Current'本身和'DateTime.Now'。静态字段是共享的(除非用'ThreadStatic'属性装饰),但静态属性可以做任何他们想要的。 – Joe 2013-10-03 21:00:52