私はちょっとした実験をしました:
public abstract class MyClass
{
private static int myInt = 0;
public static int Foo()
{
return myInt;
}
public static int Foo(int n)
{
myInt = n;
return bar();
}
private static int bar()
{
return myInt;
}
}
そして、私は走った:
MessageBox.Show(MyClass.Foo().ToString());
MessageBox.Show(MyClass.Foo(3).ToString());
MessageBox.Show(MyClass.Foo().ToString());
MessageBox.Show(MyClass.Foo(10).ToString());
MessageBox.Show(MyClass.Foo().ToString());
予想した結果は0、3、0、10、0でした。
驚いたことに、私は0、3、3、10、10を得ました。
これらの変更はどれくらいの期間持続しますか?プログラムの実行時間は?静的メソッドを呼び出す関数の期間?
これらは AppDomain の間持続します。静的変数に加えられた変更は、メソッド間で表示されます。
MSDN:
ローカル変数がStaticキーワードで宣言されている場合、その有効期間は、その変数が宣言されているプロシージャの実行時間よりも長くなります。プロシージャがモジュール内にある場合、静的変数は、アプリケーションの実行が続く限り存続します。
詳細については、次を参照してください。
予想した結果は0、3、0、10、0でした。
驚いたことに、私は0、3、3、10、10を得ました。
Foo(int)メソッド内から変更された後、静的変数が元の値に戻ることを期待する理由がわかりません。静的変数はプロセスの存続期間を通してその値を保持し、インスタンスごとではなくクラスごとに1つだけ存在します。
静的変数である場合、プログラムの実行中にメモリ内の正確に1つの場所に存在することを意味します。
C#仕様に従って、静的変数はクラスがAppDomainに初めてロードされるまでに初期化され、そのAppDomainがアンロードされるまで(通常はプログラムの終了時に)存在します。
プログラム実行中。
静的クラス変数はグローバルに似ています。クラスの特定のオブジェクトに接続されていません-プログラムごとにインスタンスは1つだけです。関数の実行時に存在する変数は、関数の自動(ローカル)変数のみです。
プログラムの実行中、または別の値で上書きするまで持続します。結果を望みどおりにしたい場合は、myIntを返す前にコンストラクターでmyInt = 0を指定する必要があります。
これらは「[プログラムが存在するアプリケーションドメインの存続期間中」に従って Microsoft Docs:Static Classes and Static Class Members(C#Programming Guide) 。
こちらもご覧ください:
静的スコープの変更は、アプリが有効な限り有効です
静的変数は、インスタンスではなくタイプに属します。通常、(複数のアプリドメインを作成していない場合)タイプオブジェクトは一度だけ読み込まれ、プロセスの存続期間中に存在します。