2011-03-24 14 views
2

ASP.Netプロジェクトでクラスを静的にすると、そのクラスのランタイムプロパティがWebサーバーのすべてのセッションで使用できるようになります。ASP.Netの通常クラス内の静的クラス

私の質問はこれです:静的に入れ子になったクラスを宣言しても、コンテナではないと宣言しても、セッション間のクラスの共有はまだ適用されますか?

例:

public class FooContainer 
    { 

     public static class Bar 
     { 
     } 

     public static class dog 
     { 
     } 
    } 
+1

どうすればよいですか?本当の問題は何ですか? –

+0

私はプロパティのような静的なクラスを使用したいと考えていましたが、サブクラスを通常のものに戻し、それらのプロパティのアクセサを作成しました。 – callisto

答えて

2

最終的にはいです。

ネストされた静的クラスは、ルートレベルの静的クラスとまったく同じにコンパイルされます(Marcはジェネリックが関与する微妙な違いに注意します)。唯一の違いは型のパスの修飾ですが、これはどのような環境でも、副作用ではありません。

4

はい。静的ネストされたクラスは、他の静的クラスと同じ動作をします。ネストされたクラスが異なる動作をするのは、外部クラスがジェネリック型である場合です(ネストされた型は親を介して暗黙的に汎用であるため、FooContainer<X>.BarFooContainer<Y>.Barから独立しています)。

注意:セッション間でデータを共有するための静的な操作は危険です。パラノイドのような同期。個人的に私はこれを行うには非常に良い理由が必要です...それは慎重な実装が必要です。私は設定キャッシングのようなものにしかそのアプローチを使用していませんが、それでも私は微妙に注意しています。

1

誰かが同じ文章で「静的データ」と「ASP.NET」と言うと、あらゆる種類の警告が消えてしまいます。マルクは、静的クラスは、彼らがネストされている場合でも、静的になるというよう

はい、あなただけの、任意のインスタンス化可能クラスは、静的メソッド/プロパティ/コンストラクタを持つことができます

MyStaticClass.StaticField = 3; ///wont work 
MyInstanceClass.MyStaticClass.StaticField = 3; // works 

含むクラスを経由して、それらを呼び出す必要がありますクラスを明示的に静的にすることは、クラスの目的と意図を明確にして、何か非静的な私の間違いをすることはできないという追加の利点があります。

しかし、ASP.netの静的クラスはアプリケーションレベルで静的な静的なクラスなので、複数のユーザーがいる場合は、承認に関係なくすべて同じ静的データが表示され、そのデータの変更はすべてのそれを使用するユーザー
静的変数は、dbから一度読み込まれたものだけを表示して、つまり現在のバージョンのアプリケーションやアプリケーションの開始時刻であるを配置するのに適していますが、配置する場所は非常に間違っていますユーザー固有のデータは、言語設定、ユーザー名などのようなものです。

+0

明確な答えをありがとう。 – callisto

関連する問題