web-dev-qa-db-ja.com

ASP.NET C#静的変数はグローバルですか?

本日、社内スタッフが製品情報を変更できる小さな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)にデータを保存します。

私の意図は、静的変数が他のユーザーから分離されており、干渉してはならないことでした。各ユーザーはページの独自のインスタンスを持っているため、「_ groupId」変数の独自のインスタンスを持っています。

幸いなことに、それはすべて、ライブデータベースではなく開発/ステージングデータベースで行われていました。変数が設定/読み取られるのを防ぐために、「static」キーワードを削除する必要があるかどうかはわかりません。

何かご意見は?ありがとう

21
Dal

はい、ASP.NETでは、静的フィールドの有効期間はアプリドメイン用です(これはジェネリック型では少し異なることに注意してください)。

クライアントブラウザセッション(ユーザーログイン)のインスタンスに関連付けるデータの保存には、サーバーセッションを使用することをお勧めします。つまり.

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

次の手順で取得できます。

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

静的変数がアプリケーション全体に存在すると言うのは誤りです。それらは実際には2つの異なるレベルで存在します

  1. 非ジェネリック型の場合、AppDomainごとに1つの静的変数があります
  2. ジェネリック型の場合、AppDomainごとにジェネリックインスタンス化ごとに1つあります

アプリケーションには多くのAppDomainを含めることができ、いくつかのタイプのアプリケーションに当てはまります。

ただし、ユーザー固有の設定を保存する場合は、Session変数を使用します。

19
JaredPar

静的変数の有効期間は、それらが作成されたアプリケーションドメインと同じです。したがって、間違った値を取得すると、アプリケーションロジックなどで問題が発生する可能性があります。ユーザーごとのデータにはSessionStateを使用する必要があります。

2
Restuta

StaticキーワードがC#で何を担当しているのかを理解するために、少し時間がかかる場合があります。ここを読んでください: 異なる言語で静的 および MSDNはここ

2
LBushkin