web-dev-qa-db-ja.com

C#静的変数-スコープと永続性

私はちょっとした実験をしました:

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を得ました。

これらの変更はどれくらいの期間持続しますか?プログラムの実行時間は?静的メソッドを呼び出す関数の期間?

33
Ozzah

これらは AppDomain の間持続します。静的変数に加えられた変更は、メソッド間で表示されます。

MSDN:

ローカル変数がStaticキーワードで宣言されている場合、その有効期間は、その変数が宣言されているプロシージャの実行時間よりも長くなります。プロシージャがモジュール内にある場合、静的変数は、アプリケーションの実行が続く限り存続します。

詳細については、次を参照してください。

47
YetAnotherUser

予想した結果は0、3、0、10、0でした。

驚いたことに、私は0、3、3、10、10を得ました。

Foo(int)メソッド内から変更された後、静的変数が元の値に戻ることを期待する理由がわかりません。静的変数はプロセスの存続期間を通してその値を保持し、インスタンスごとではなくクラスごとに1つだけ存在します。

27
Ed S.

静的変数である場合、プログラムの実行中にメモリ内の正確に1つの場所に存在することを意味します。

7
Chris Eberle

C#仕様に従って、静的変数はクラスがAppDomainに初めてロードされるまでに初期化され、そのAppDomainがアンロードされるまで(通常はプログラムの終了時に)存在します。

5
Ben

プログラム実行中。

静的クラス変数はグローバルに似ています。クラスの特定のオブジェクトに接続されていません-プログラムごとにインスタンスは1つだけです。関数の実行時に存在する変数は、関数の自動(ローカル)変数のみです。

4
Seva Alekseyev

プログラムの実行中、または別の値で上書きするまで持続します。結果を望みどおりにしたい場合は、myIntを返す前にコンストラクターでmyInt = 0を指定する必要があります。

1
Viken Ong

これらは「[プログラムが存在するアプリケーションドメインの存続​​期間中」に従って Microsoft Docs:Static Classes and Static Class Members(C#Programming Guide)

こちらもご覧ください:

1
weir

静的スコープの変更は、アプリが有効な限り有効です

0
Marek

静的変数は、インスタンスではなくタイプに属します。通常、(複数のアプリドメインを作成していない場合)タイプオブジェクトは一度だけ読み込まれ、プロセスの存続期間中に存在します。

0
Andrew Bezzub