2009-04-30 6 views
3

変数の範囲とは少し奇妙な問題があります。私は次のように変数を宣言しました:ASP.Net変数の範囲

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

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

これは私のページの仕組みでうまくいきます。しかし、2人のユーザーが同じページを使用していると、私はクロスオーバーしていることがわかります。 1人のユーザーが変数を5に設定し、他のユーザーがその変数にアクセスした場合、5に設定されます。最初に設定したユーザーのみがアクセスできるように変数を設定するにはどうすればよいですか?

protected int MyGlobalVariable; 

もっとStatic variables

答えて

6

静的と宣言した場合、クラスのすべてのインスタンスに対して1つのインスタンスのみが存在するため、同じページの複数のインスタンスで複数のユーザーが同じ値にアクセスします。

いずれかstatic修飾子なしのintを宣言するか、そのユーザーのために存続することを必要とする場合、(セッションスコープの場合)またはSession

例えば(ページスコープ用)Viewstateを使用することを検討してください

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; 
    } 
} 
+0

おかげさまでバットマン、それは私が探していたエレガントなソリューションでした –

2

はstatic宣言を削除します。

スタティック変数は、同じメモリアドレスを内部的に使用します。したがって、すべてのユーザーは同じ値を格納します。

まあ、これは、 'public' varilablesが必要な場合に使用します。次に、viewstateやsessionのようなトリックを使う必要があります。

0

に今までに、ページ内の静的変数を使用しないでください:

+4

意図した動作をthatsのない限り... –

+0

noobの質問... "今までに静的変数を使用しないでください":パブリック変数を使用する方法を? –