Partial Public Class myPage
Inherits System.Web.UI.Page
Protected Shared Variable1 As Integer
Protected Shared array1(10) As String
声明受保护的共享,我的变量“保持”我在页面中调用的每个函数的值,并且它们在每个回发中保留它们的值。
但昨天有人告诉我,所有用户访问我的网站的变量都是SHARED ..(所以用户A看到用户B的变量值,用户C等)
任何人都可以帮我澄清一下吗?
答案 0 :(得分:2)
你的方法几乎肯定是个坏主意。
共享变量为您的应用程序实例化一次,并为访问它的任何线程保留放入其中的最后一个值。仔细考虑依赖于变量值的任何代码 - 对任何两行代码之间的任何时候发生的任何代码的修改都可能来自正在执行可能修改它的代码的任何线程
Shared
与最终用户本身的可见性无关。 Shared
表示该变量只有一个实例,因此每个实例化myPage
类的请求都将使用完全相同的内存作为其Variable1和array1引用。 Protected
修饰符确保除myPage
或派生类之外的任何类都不能查看和修改变量,但执行使用myPage
的请求的任何用户肯定会使用相同的变量引用 - 并因此改变任何其他用户的价值。
如果要维护用户会话的变量值,请使用Session
对象,这正是它的用途。
Session["Variable1"] = "usersProtectedString";
如果要维护整个应用程序中所有用户的值,请使用Application
对象。
Application.Lock();
Application["Variable1"] = "stringForAllUsers";
Application.Unlock();
答案 1 :(得分:0)
共享意味着共享。它可以被其他用户同时访问。 尝试
Partial Public Class myPage
Inherits System.Web.UI.Page
Protected Shared Variable1 As String
Protected Shared array1(10) As String
并启动它
Dim mypage As New myPage
mypage.Variable1 = "My Protected String That No One Else Can Gain Access To"
如果您需要在多个页面中维护变量,请使用会话变量。
Session("Variable1") = "My string that I can use all over the site but is still only accessible by me"
您还可以在变量中存储不同类型的对象
Dim theDate as DateTime = DirectCast(Session("theDate"), DateTime)
答案 2 :(得分:0)
AFAIK,如果需要,有两种方法可以在ASP.Net中共享变量:
答案 3 :(得分:-1)
没有特别的理由为什么这些变量会在回发中保持状态。当然,它们不会在用户之间共享。如果它们保留了值,那是因为其他人保存了它们(可能在页面视图状态中?)