【问题标题】:ASP.NET How to mantain variables valueASP.NET 如何维护变量值
【发布时间】:2010-06-23 22:41:16
【问题描述】:

大家好,我有一个很大的疑问...... 从 nwo 开始,我总是像这样声明我的 aspx 变量页面

Partial Public Class myPage
    Inherits System.Web.UI.Page

    Protected Shared Variable1 As Integer
    Protected Shared array1(10) As String

声明受保护的共享,我的变量为我在页面中调用的每个函数“维护”它们的值,并且它们在每次回发中保持它们的值。

但昨天有人告诉我,该变量对于所有访问我的网站的用户都是共享的..(所以用户 A 看到用户 B、用户 C 等的变量值)

谁能帮我澄清一下?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    您的方法几乎可以肯定是个坏主意。

    为您的应用程序实例化一个共享变量一次,并为访问它的任何线程保留放入其中的最后一个值。仔细考虑依赖变量值的任何代码 - 对值的修改可能发生在任何时间,在任何两行代码之间,来自任何正在执行可能修改它的代码的线程.

    Shared 与最终用户的可见性没有任何关系本身Shared 表示该变量只有一个实例,因此每个实例化 myPage 类的请求都将使用 完全相同的内存 用于它们的 Variable1 和 array1 引用。 Protected 修饰符确保除了myPage 或派生类之外的任何类都不能看到和修改变量,但是任何执行使用myPage 的请求的用户肯定会使用相同的变量引用——因此会更改值对于任何其他用户。

    如果您想为用户会话维护变量的值,请使用 Session 对象,这正是它的用途。

    Session["Variable1"] = "usersProtectedString";
    

    如果您想维护整个应用程序中所有用户的值,请使用Application 对象。

    Application.Lock();
    Application["Variable1"] = "stringForAllUsers";
    Application.Unlock();
    

    【讨论】:

      【解决方案2】:

      共享意味着共享。其他用户可以同时访问。 试试

      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)
      

      【讨论】:

        【解决方案3】:

        AFAIK,如果需要,在 ASP.Net 中有两种共享变量的方法:

        1. 使用 Application 对象,因为整个应用程序池只有一个。
        2. 使用静态变量。几年前这一次让我大吃一惊,所以我确实学到了这一课。

        【讨论】:

          【解决方案4】:

          这些变量在回发过程中保持其状态并没有什么特别的原因。当然,它们不会在用户之间共享。如果它们保留值,那是因为其他人保存了它们(可能在页面视图状态中?)

          【讨论】:

          • 那么,您是在告诉我它们仅对 .. owner 用户可见?
          • 不,共享与最终用户的可见性没有任何关系。 Shared 意味着该变量只有一个实例,因此实例化 myPage 类的每个请求都将使用完全相同的内存来存储它们的 Variable1 和 array1 引用。 Protected 确保除 myPage 或派生类之外的任何类都不能修改变量,但任何执行使用 myPage 的请求的用户肯定会使用相同的变量引用。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-23
          • 2015-03-17
          • 2017-12-04
          • 1970-01-01
          • 1970-01-01
          • 2011-01-06
          • 2011-05-20
          相关资源
          最近更新 更多