用户之间共享的公共共享变量?

时间:2012-03-30 08:25:09

标签: asp.net vb.net

我已经接管了网站的维护(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是否可以由当前用户以外的任何其他用户访问或更改?

非常感谢

2 个答案:

答案 0 :(得分:9)

Shared变量与C#中的static变量相同。

这些可以在所有实例之间共享,因此不同的用户将共享相同的变量。

查看变量名称,我认为您需要删除此Shared


您正在将Session变量值应用于Shared String上的Page_Init

因此,每次用户加载页面时,其会话变量都将覆盖当前值。


如果您不在此课程之外使用此变量,那么我建议将其更改为:

Protected UserNumber As String

答案 1 :(得分:4)

编辑我的初步答案不正确。再试一次......

从技术上讲,正如@Curt所指出的,Shared变量在该类的实例之间共享。

但是,使用代码,不太可能在用户之间共享该值,因为它在Page_Init的会话中设置为每个用户的值的本地副本。

可能存在“竞争条件”,其中共享变量UserNumberPage_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”的模式,我在页面上大量使用只读属性来提高代码的性能和可读性。