2011-07-12 19 views
2

最近問題があります。私はMyObjectにの宣言が含まれていない別のページをロードする場合、今静的オブジェクト/変数は.NETのWebアプリケーションのキャッシュ/セッションに格納されていますか?

public static MyObject myobject=new MyObject(); 
Response.Write(myobject.Title()); 

をし、私は再び

Response.Write(myobject.Title()); 

を実行します。Webフォーム上で

は、私はこのように、静的オブジェクトを宣言します私は以前の結果を見る。オブジェクトは静的なためにナビゲーション中にセッションに保存されていますか? VIEWSTATEにはそれが当てはまりますか?または何が起こっている?

+4

ページのスタティックフィールドはありません! –

+0

これはアプリケーションに格納されています(サーバー側、すべてのユーザー)。 –

+0

@ダニーチェン:なぜですか? – markzzz

答えて

2

これは単なる静的変数です。それは同じ型の同じフィールドを同じコードにアクセスするすべてのコードが同じ型の中で共有するように、型の中に "生きる"ものです。AppDomainそれは場合...基本的には、ローカルキャッシュのために時折以外のwebappsにstatic変数を使用することはお勧めできませんなど、

+0

Uhm ...しかし、テロリズム的には、各「ユーザー」に同じオブジェクトのインスタンスがあります。私は、ページとインスタンスMyObjectを要求するユーザーは、そのユーザーにアクセスし、別のユーザーの別のインスタンスにはアクセスしないことを意味します。だから問題は何か? – markzzz

+1

静的変数はインスタンスに属しておらず、型に属します。したがって、ユーザーはページのインスタンスを取得しますが、サーバーはそのタイプを保持します。各インスタンスは、型の静的変数があればそれを取得します。 AppDomainがリサイクルすると、静的変数がリセットされます。 –

+0

したがって、UserAが静的オブジェクトを保持し、それに(例えば)データMarcoを保存すると、別のユーザー(たとえばUserB)がMarcoを読み取ることができますか? – markzzz

4

いいえ、プロセス内に静的変数として格納されています。これは、IISを使用していると仮定すると、いつでもリサイクルできます。

要するに、この状況では静的変数を使用しないでください。

何が起こっているのかを広げる。静的変数はIISによって制御されるサーバーのプロセスに格納されます。サーバーにコールバックするときにプロセスがまだ生きているだけです。 IISはいつでもこのプロセスをリサイクルできます。

更新:それはプロセスに座っているのAppDomain、あたりにあるより正確 OK -

2

静的オブジェクトは、ユーザー間で共有されている:-)私の前の段落でのAppDomainでワードプロセスに置き換えます。各ページに固有のユーザーまたはビューの状態に固有のセッションには格納されません。

ASP .NET State Management Recommendationsを読んで、どのシナリオにどの種類の状態管理機能を使用するかを調べてください。

1

AppDomainリサイクルに失われ、複数のサーバ間で共有されることはありません動的オブジェクト定義と静的オブジェクトの2つの別々のオブジェクトを1つのクラス内で宣言できるという見解を持っています。通常、同じクラス定義内でこれらを作成する場合、それらの間に接続があり、それらは連動して動作します(シングルトンパタンが主要な例です)。

つまり、オブジェクトは動的オブジェクトに基づいて作成されます。動的オブジェクトの作成によって影響を受けない静的オブジェクトはまだ存在します。これは混乱する可能性があるので、2つのものを区別せずにこれら2つを組み合わせてはいけません。

私はこれが何が起こっているのかを本当に理解していないことを認識していますが、それは私の頭の中で区別を維持するのに役立ちます。それぞれの型はそれぞれ独自の使い方があり、適切に使用する必要があります(静的でなければならない動的クラスも見てきました)。

関連する問題