静态变量在ASP.NET页面中的作用在哪里?

时间:2010-04-26 16:24:31

标签: c# asp.net static-members

我今天接受采访,一切都很顺利,但随后一位采访者问我一个问题静态变量在C#中的位置 - 在应用程序级别或页面级别

我对这个答案并不是很清楚,因为我只知道静态变量存储在堆上,而我对Web相关的东西一无所知。

然后他试图通过举例说明我在一个页面中使用静态变量并且三个用户正在访问页面,其中一个用户更新了静态变量的值,那么他试图让我更清楚。剩下的两个值可以看到什么值用户将反映旧副本或更新。

3 个答案:

答案 0 :(得分:20)

除非是[ThreadStatic],否则静态变量每个AppDomain只有一个值。

在ASP.Net中,每个应用程序都有自己的AppDomain,因此静态变量将由应用程序中的所有请求共享。这就是面试官所得到的 - 在ASP.Net应用程序中使用static变量是一个常见的错误,当多个请求同时发生时,可能会导致神秘的损坏错误。

答案 1 :(得分:4)

在一个页面更改值后,其他页面都将获得更新的值。

这可能是也可能不是你想要的。这就是静态变量在Web编程中很危险的原因。例如,在Winforms应用程序中,静态变量可以很好地存储此进程的全局值,因为可能只有一个进程在运行。你得到了预期的行为。

但是,在Web应用程序中,您的代码可以在同一AppDomain 中的多个线程中启动。当共享价值时,开发人员有时会感到惊讶。

如果您希望值不同(通常这样做),可以使用 ThreadStatic 属性强制执行此操作。不同的Web请求在不同的线程中,因此它们将保持彼此无知。我从不使用这个,因为我不相信垃圾收集在下一次调用之前去除了值,这可能会重用相同的线程。同样,我不相信静态变量有意在asp.net线程之间共享值;使用server variable

答案 2 :(得分:2)

C#with ASP.NET中的静态变量在应用程序级别工作。

就它们获得的值而言,它取决于它们是否在页面更新静态变量之前或之后访问变量。如果他们在更改静态变量之前获取值,则会看到旧值。如果在更改静态变量后获取值,则它们将获得新值。静态变量在ASP.NET中可能会很麻烦,我建议它们只用于常量值或只读用于不可变类。