每个用户的静态对象是唯一的吗?

发布于 2024-09-24 20:25:40 字数 554 浏览 3 评论 0原文

我有一个 .net 应用程序(c#),其内容如下

public partial class _Default : System.Web.UI.Page
{
    #region initial variables setup

    private static exam theExam;

    #endregion


    protected void Page_Load(object sender, EventArgs e)
    {
       if(!IsPostBack)
       {
        string userid = Request.Querystring["user"].ToString();
           theExam = new exam(userid, "some values");
       }
    }
// rest of code.

现在我的问题是,如果用户 105 登录考试实例,则会创建考试并将其分配给顶部的静态声明。如果用户 204 然后从另一台计算机登录,即使在用户 105 的计算机上,顶部的静态对象是否也会获得 204 的值?

I have a .net application (c#) that goes something like this

public partial class _Default : System.Web.UI.Page
{
    #region initial variables setup

    private static exam theExam;

    #endregion


    protected void Page_Load(object sender, EventArgs e)
    {
       if(!IsPostBack)
       {
        string userid = Request.Querystring["user"].ToString();
           theExam = new exam(userid, "some values");
       }
    }
// rest of code.

Now my question is, if user 105 logs in an instance of exam theExam is created and assign to the static declaration on top. If user 204 then logs in from a different computer, does the static object at the top gets the value of 204 even on user's 105's computer?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

暮年慕年 2024-10-01 20:25:40

不,静态对象对于每个登录的人来说都是同一个实例。当然,该对象并不存在于 105 的计算机上,而只是存在于 Web 服务器上。

No, the static object is the same instance for everyone logged on. Also the object doesn't live on 105's computer but just on the web server ofcourse.

硪扪都還晓 2024-10-01 20:25:40

静态变量的生命周期和用户会话是非常不同的概念。静态变量的生命周期由 CLR 定义,本质上可归结为以下 2 条规则

  1. 每个 AppDomain 都有一个静态变量的存储位置
  2. 泛型类型的每个唯一实例都会创建一个不同的静态变量。

我发现很难在不明确唯一的情况下编写第二条规则。本质上,MyTypeMyType 各自具有不同的静态变量。而 MyTypeMyType 共享同一个。

用户对 Web 服务器的访问不会影响其中任何一个。

如果您想要每个用户的数据,请使用Session来存储数据。

Session["examKey"] = theExam;

Lifetime of static variables and user sessions are very different concepts. Static variables have a lifetime defined by the CLR and essentially boils down to the following 2 rules

  1. There is one storage location for a static variable per AppDomain
  2. Each unique instatiation of a generic type creates a different static variable.

I'm finding it hard to write the second rule without it being ambiguous as to unique. Essentially MyType<int> and MyType<string> each have different static variables. While MyType<int> and MyType<int> share the same one.

User's acess to a web server don't affect either of these.

If you want to have per user data then use the Session to store the data.

Session["examKey"] = theExam;
飘落散花 2024-10-01 20:25:40

简短的回答:是的,静态字段对于 AppDomain 来说是全局的,因此为一个用户执行此操作将会占用另一用户的数据。

您可能想考虑使用会话存储,它的范围是每个用户的,例如

var theExam = Session["exam"] as Exam;

Short answer: yes, the static field is global to the AppDomain, so doing this for one user will step on the data for another user.

You probably want to look into using Session storage instead, which is scoped per-user, e.g.

var theExam = Session["exam"] as Exam;
污味仙女 2024-10-01 20:25:40

每个 AppDomain 有一个静态对象的“实例”。所以你的问题的答案是肯定的。由于您在用户 204 登录时覆盖了该变量,因此用户 105 也会出现相同的值。

一些一般建议

  • 尽可能避免静态字段
  • 使用会话在用户浏览会话的上下文中存储临时信息
    Session["exam"] = currentUser.Exam;
  • 使用配置文件提供程序在会话之间保留有关每个用户的信息。

There is one "instance" of a static object per AppDomain. So the answer to your question is yes. Since you overwrite the variable when user 204 logs in, the same value will appear for user 105, too.

Some general advices

  • Avoid static fields wherever possible
  • Use the Session for storing temporary information in the context of a user's browsing session
    Session["exam"] = currentUser.Exam;
  • Use a Profile Provider for persisting information about each user between sessions.
终难愈 2024-10-01 20:25:40

.Net 中还有一个 [ThreadStatic] 属性,可以为每个线程生成一个静态实例。

http://msdn.microsoft.com/en- us/library/system.threadstaticattribute(VS.71).aspx

There's also a [ThreadStatic] attribute in .Net that will make one static instance per thread.

http://msdn.microsoft.com/en-us/library/system.threadstaticattribute(VS.71).aspx

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文