13

我今天接受了面试,一切都进行得很好,但后来面试官问了我一个问题,静态变量在 C# 中在哪里工作——在应用程序级别或在页面级别

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

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

4

3 回答 3

20

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

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

于 2010-04-26T16:27:38.180 回答
4

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

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

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

如果您希望值不同(通常是这样),您可以使用ThreadStatic属性强制执行此操作。不同的 Web 请求在不同的线程中,因此它们将保持互不了解。我从不使用它,因为我不相信垃圾收集会在下一页调用之前摆脱该值,这可能会重用同一个线程。同样,我不会相信静态变量会在 asp.net 线程之间有目的地共享值。使用服务器变量

于 2010-04-26T16:29:47.443 回答
2

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

至于他们会得到什么值,这取决于他们是在页面更新静态变量之前还是之后访问该变量。如果他们在更改静态变量之前获得值,他们将看到旧值。如果他们在静态变量更改后获得值,他们将获得新值。静态变量在 ASP.NET 中可能很麻烦,我建议它们仅用于常量值或只读、不可变类。

于 2010-04-26T16:32:29.000 回答