2011-02-09 11 views
1

のは、このページのコードビハインド考えてみましょう:同じASPXページのすべてのインスタンスが同じ静的フィールドを共有していますか?

public partial class Products : Page 
{ 
    private static SomeClass SharedField; 

    public Product() 
    { 
     // ... Some logic 
    } 
} 

はすべてProductsページインスタンスが同じSharedFieldを共有しています、私はこれがstaticフィールドの基本的な概念であることを知っています。しかし、この場合は本当ですか?すべてのユーザーは、Webサイトレベルの同じ静的フィールドにアクセスできます(独自のインスタンスを持つことはできません)。

もしそうなら、これはどのような面でこれがウェブ開発者によって使用されるでしょうか?またはこれは推奨されない方法ですか?

答えて

2

はい、その静的フィールドのインスタンスはすべてのユーザーに対して1つのワーカープロセス内にのみ存在します。ウェブファーム/ウェブガーデンをご利用の場合は、それぞれ独自の静的インスタンスが作成されます。ワーカープロセスが再起動すると、新しい静的インスタンスが取得されます。

スレッドの安全性を確保するには、その共有フィールドの周りにロックを使用する必要があります。

なぜそれを使用するかについては、わかりませんが、私はそれをしません。私が与えることができる最良の例は、ビルトインの静的HttpContext.Currentです。要求、応答などへのアクセスを提供します。

+0

'だけで、単一のワーカープロセス内...' +1 –

2

SharedFieldは、Webサイトのライフサイクル全体にわたって1つのインスタンスで利用可能になります。

さらに詳しく読むには、see this answerをご覧ください。

0

オブジェクトをアプリケーション状態に保存することをお勧めします。

Application["MyObject"] = new SomeClass();

+0

は信じられないかもしれませんが、Microsoftが代わりに静的を使用することを言います。 http://stackoverflow.com/questions/4879023/what-is-the-life-span-of-a-field-in-a-static-class/4879119#4879119 – Greg

+0

うわー、それは本当に私を驚かせました!とにかく、ApplicationオブジェクトはCacheオブジェクトによって置き換えられたと思います。 – GavinH

関連する問題