質問

変数のスコープに関連する奇妙な問題が少しあります。次の方法で変数を宣言しました。

public partial class MyClass: System.Web.UI.Page
{
    protected static int MyGlobalVariable;

    protected void MyFunction()
    {
        MyGlobalVariable = 1;
    }
}

そして、これは私のページの動作でうまく機能します。しかし、2人のユーザーが同じページを使用しているとき、私はクロスオーバーしていることに気付きます。あるユーザーが変数を5に設定し、他のユーザーがその変数にアクセスした場合、その変数は5に設定されます。変数を設定すると、最初に設定したユーザーのみがアクセスできるようになります。

役に立ちましたか?

解決

MyGlobalVariable をstaticとして宣言すると、クラスのすべてのインスタンスに対してそのインスタンスが1つだけ存在するため、同じページの複数のインスタンス上の複数のユーザーがアクセスします同じ値。

static 修飾子なしでintを宣言するか、そのユーザーに対して永続化する必要がある場合は、 Viewstate (ページスコープ用)または Session (セッションスコープ用)

e.g。

protected int MyGlobalVariable
{
    get
    {
        return ViewState["MyGlobalVariable"] != null ? Convert.ToInt32(ViewState["MyGlobalVariable"] : 0;
    }
    set
    {
        ViewState["MyGlobalVariable"] = value;
    }
}

または

protected int MyGlobalVariable
{
    get
    {
        return Session["MyGlobalVariable"] != null ? Convert.ToInt32(Session["MyGlobalVariable"] : 0;
    }
    set
    {
        Session["MyGlobalVariable"] = value;
    }
}

他のヒント

静的宣言を削除します:

protected int MyGlobalVariable;

静的変数

の詳細

ページで静的変数を使用しないでください。

静的変数は、内部で同じメモリアドレスを使用します。したがって、すべてのユーザーに同じ値が保存されます。

まあ、これを「パブリック」バリアブルが必要な場合に使用します。次に、ビューステートやセッションなどのトリックを使用する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top