ASP.NET C#静态变量是全球性的?(ASP.NET C# Static Variables a

2019-07-23 10:47发布

今天我发布了一个小asp.net测试Web应用程序,它允许内部人员修改了一些产品信息。 我们开始运行到哪里使用者覆盖其他产品信息......尽管每个工作人员在编一个完全不同的行(产品)的问题。

在谷歌经过一番搜索,我想我知道是怎么回事,它做的使用静态变量,以下是问题的一个快速粗略的例子:

// EditProductGroup.aspx.cs
public partial class EditProductGroup : System.Web.UI.Page
{

    private static int _groupId = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
      _groupId = Convert.ToInt16(Request.QueryString["GroupID"]);

     // get existing ProductGroup information from database using 
     //_groupId to find the row and populate textboxes
    }

    private void saveProductGroupData()
    {
      // when user hits 'save changes' button, update row 
      //where the primary key column 'ProductGroupID' matches _groupId in the table
    }
}

因此,根据我的研究,一个静态变量实际存在的应用程序作为一个整体,这意味着,如果多个用户使用,他们将有效地全部读取相同的“价值”为“_groupId”在某些情况下的应用程序实际上设置它为不同的值造成另一个用户页面的“实例”将数据保存到错误的行(ProductGroupId)。

我的目的是,静态变量是从其他用户隔离,并且不应该intefere - 每个用户都有自己的页面从而自己的“_groupId”变量的实例的实例。

幸运的是,这是一个开发/临时数据库不能实时数据库上的所有发生。 我不知道我是否只需要下车的“静态”关键字阻止变量被设置/每个人都读。

有什么想法吗? 谢谢

Answer 1:

是的,在ASP.NET中的静态字段寿命的应用程序域(注意,这有些不同泛型类型)。

我建议你使用数据的存储要与客户端浏览器会话(用户登录)的实例关联的服务器会话。 即

Session["_groupID"] = Convert.ToInt16(Request.QueryString["GroupID"]);

您可以通过检索它:

short groupID = Convert.ToInt16(Session["_groupID"]);


Answer 2:

这是不正确的说,一个静态变量存在广泛的应用。 他们实际上是存在于两个不同的层次

  1. 对于非泛型类型有每个AppDomain单一的静态变量
  2. 对于泛型类型有每人的AppDomain泛型实例一个

应用程序可以包含多个应用程序域和是真实的几种类型的应用程序。

如果要存储用户特定的设置虽然使用Session变量。



Answer 3:

静态变量具有相同的寿命,因为他们在创建一个应用程序域。所以,如果你得到一些错误的价值观也可以在应用程序逻辑或其他一些问题。 您应该使用SessionState的每用户数据。



Answer 4:

您可能需要花一些时间来熟悉一下static关键字负责C#。 在这里阅读: 静中有不同的语言和MSDN这里 。



文章来源: ASP.NET C# Static Variables are global?