簡體   English   中英

ASP.NET C#靜態變量是全局的嗎?

[英]ASP.NET C# Static Variables are global?

今天我發布了一個小的asp.net beta網絡應用程序,允許內部員工修改一些產品信息。 我們開始遇到用戶覆蓋彼此產品信息的問題......即使每個工作人員正在編輯一個完全不同的行(產品)。

經過一些谷歌搜索,我想我知道發生了什么,它與靜態變量的使用有關,下面是一個快速粗略的問題示例:

// 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)。

我的意圖是靜態變量與其他用戶隔離,並且不應該是 - 每個用戶都有自己的頁面實例,因此他們自己的'_groupId'變量實例。

幸運的是,這一切都發生在dev / staging數據庫而不是live db上。 我不確定是否只需要刪除'static'關鍵字來停止每個人設置/讀取的變量。

有什么想法嗎? 謝謝

是的,在ASP.NET中,靜態字段生命周期適用於應用程序域(請注意,這對於泛型類型而言略有不同)。

我建議使用服務器會話來存儲要與客戶端瀏覽器會話實例關聯的數據(用戶登錄)。

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

你可以通過這樣做來檢索它:

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

說應用程序范圍內存在靜態變量是不正確的。 它們實際上存在於兩個不同的層面

  1. 對於非泛型類型,每個AppDomain都有一個靜態變量
  2. 對於泛型類型,每個AppDomain每個通用實例化都有一個

應用程序可以包含許多AppDomain,並且在多種類型的應用程序中都是如此。

如果要存儲用戶特定的設置,請使用Session變量。

靜態變量與它們創建的應用程序域具有相同的生命周期。因此,如果您得到一些錯誤的值,那么它可能是應用程序邏輯中的一些問題。 您應該為每個用戶數據使用SessionState。

您可能需要花一些時間來熟悉靜態關鍵字在C#中負責的內容。 在這里閱讀: 不同語言的靜態MSDN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM