13

今日インタビューをしましたが、すべてが順調に進んでいましたが、インタビュアーから、静的変数はC#-アプリケーションレベルまたはページレベルでどこで機能するのかという質問がありました。

静的変数がヒープに格納されていることだけを知っていて、Web関連のことについては何も知らなかったので、この答えについてはあまり明確ではありませんでした。

次に、彼は、静的変数を使用しているページで3人のユーザーがページにアクセスしている例を挙げて、私をより明確にしようとしました。ユーザーの1人が静的変数の値を更新し、残りの2人のユーザーにはどの値が表示されますか。コピーまたは更新が反映されます。

4

3 に答える 3

20

そうでない限り[ThreadStatic]、静的変数はAppDomainごとに1つの値しか持ちません。

ASP.Netでは、各アプリケーションに独自のAppDomainがあるため、静的変数はアプリケーション内のすべての要求で共有されます。これがインタビュアーが得ていたものstaticです。ASP.Netアプリケーションで変数を使用することは、複数の要求が同時に発生した場合に不思議な破損エラーにつながる可能性のある一般的な間違いです。

于 2010-04-26T16:27:38.180 に答える
4

1つのページで値が変更されると、他のページはすべて更新された値を取得します。

これはあなたが望むものかもしれないし、そうでないかもしれません。これが、静的変数がWebプログラミングで危険である理由です。たとえば、Winformsアプリケーションでは、実行されているプロセスが1つだけである可能性が高いため、静的変数はこのプロセスに対してグローバルな値を格納するために正常に機能します。期待どおりの動作が得られます。

ただし、Webアプリケーションでは、同じAppDomain内の複数のスレッドでコードを開始できます。価値が共有されると、開発者は時々驚かされます。

値を変えたい場合(通常はそうします)、ThreadStatic属性を使用してこれを強制することができます。異なるWebリクエストは異なるスレッドにあるため、それらは互いに無知のままになります。同じスレッドを再利用する可能性のある次のページ呼び出しの前にガベージコレクションが値を削除することを信頼していないため、これを使用することはありません。同様に、asp.netスレッド間で意図的に値を共有するための静的変数は信頼しません。サーバー変数を使用します。

于 2010-04-26T16:29:47.443 に答える
2

ASP.NETを使用したC#の静的変数は、アプリケーションレベルで機能します。

取得する値に関しては、ページが静的変数を更新する前または後に変数にアクセスするかどうかによって異なります。静的変数が変更される前に値を取得すると、古い値が表示されます。静的変数が変更された後に値を取得すると、新しい値を取得します。静的変数はASP.NETで厄介な場合があります。静的変数は、定数値または読み取り専用の不変クラスにのみ使用することをお勧めします。

于 2010-04-26T16:32:29.000 に答える