我已经接管了网站的维护(ASP.NET VB),在一个特定的页面上,我注意到了下面的代码
Inherits System.Web.UI.Page
Public Shared UserNumber As String
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
UserNumber = Session("UserNumber")
...
End Sub
我的问题是变量UserNumber是否可以由当前用户以外的任何其他用户访问或更改?
非常感谢
答案 0 :(得分:9)
Shared
变量与C#中的static
变量相同。
这些可以在所有实例之间共享,因此不同的用户将共享相同的变量。
查看变量名称,我认为您需要删除此Shared
您正在将Session
变量值应用于Shared String
上的Page_Init
。
因此,每次用户加载页面时,其会话变量都将覆盖当前值。
如果您不在此课程之外使用此变量,那么我建议将其更改为:
Protected UserNumber As String
答案 1 :(得分:4)
编辑我的初步答案不正确。再试一次......
从技术上讲,正如@Curt所指出的,Shared
变量在该类的实例之间共享。
但是,使用代码,不太可能在用户之间共享该值,因为它在Page_Init
的会话中设置为每个用户的值的本地副本。
可能存在“竞争条件”,其中共享变量UserNumber
在Page_Init
中初始化后,另一个用户提交了一个请求,该请求从其会话中更新该变量的值,然后,用户将看到第二个用户的值。即用户可以查看其他用户的并发请求值。
相反,我建议使用ReadOnly
非共享属性从会话中获取值:
Private mUserNumber As String
Public ReadOnly Property UserNumber As String
Get
If String.IsNullOrEmpty(mUserNumber) Then
mUserNumber = Session("UserNumber")
End If
Return mUserNumber
End Get
End Property
这使用了一个名为“Lazy-loading”的模式,我在页面上大量使用只读属性来提高代码的性能和可读性。