webentwicklung-frage-antwort-db.com.de

C # Statische Variablen - Umfang und Persistenz

Ich habe gerade ein kleines Experiment gemacht:

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;
  }
}

und dann lief ich:

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());

Die erwarteten Ergebnisse waren 0, 3, 0, 10, 0.

Zu meiner Überraschung bekam ich 0, 3, 3, 10, 10.

Wie lange dauern diese Änderungen an? Die Dauer der Programmausführung? Die Dauer der Funktion, die die statische Methode aufruft?

30
Ozzah

Sie bleiben für die Dauer von AppDomain bestehen. Änderungen an statischen Variablen sind über Methoden hinweg sichtbar. 

MSDN:

Wenn eine lokale Variable mit dem Schlüsselwort Static deklariert wird, ist ihre Lebensdauer länger als die Ausführungszeit der Prozedur, in der sie deklariert wird. Wenn sich die Prozedur in einem Modul befindet, bleibt die statische Variable erhalten, solange Ihre Anwendung ausgeführt wird.

Weitere Einzelheiten finden Sie hier:

45
YetAnotherUser

Die erwarteten Ergebnisse waren 0, 3, 0, 10, 0.

Zu meiner Überraschung bekam ich 0, 3, 3, 10, 10.

Ich bin nicht sicher, warum Sie erwarten würden, dass die statische Variable nach der Änderung innerhalb der Foo (int) -Methode auf ihren ursprünglichen Wert zurückgesetzt wird. Eine statische Variable behält ihren Wert während der gesamten Lebensdauer des Prozesses bei, und pro Klasse ist nur eine vorhanden, nicht die Instanz.

27
Ed S.

Wenn es sich um eine statische Variable handelt, bedeutet dies, dass für die Dauer des Programms genau eine Stelle im Speicher vorhanden ist.

6
Chris Eberle

Gemäß der C # -Spezifikation wird eine statische Variable spätestens beim ersten Laden einer Klasse in eine AppDomain initialisiert und ist so lange vorhanden, bis diese AppDomain entladen wird - normalerweise, wenn das Programm beendet wird.

5
Ben

Für die Dauer der Programmausführung.

Statische Klassenvariablen sind wie Globals. Sie sind nicht mit bestimmten Objekten einer Klasse verbunden - es gibt nur eine Instanz davon pro Programm. Die einzigen Variablen, die während der Funktionsausführung leben, sind automatische (lokale) Variablen der Funktion.

4
Seva Alekseyev

Sie bleibt solange bestehen, bis das Programm ausgeführt wird oder bis Sie es mit einem anderen Wert überschreiben. Wenn Sie das Ergebnis so gestalten möchten, wie Sie es haben wollen, sollten Sie im Konstruktor myInt = 0 angeben, bevor Sie myInt zurückgeben.

1
Viken Ong

Sie bleiben "für die Lebensdauer der Anwendungsdomäne, in der sich Ihr Programm befindet" gemäß Microsoft Docs: Statische Klassen und statische Klassenmitglieder (C # -Programmierhandbuch) .

Siehe auch:

1
weir

Ihre Änderungen im statischen Umfang bleiben so lange gültig wie Ihre App

0
Marek

Statische Variablen gehören zum Typ, nicht zur Instanz. Normalerweise (wenn Sie nicht mehrere App-Domänen erstellen) werden Objektobjekte nur einmal geladen und sind während der gesamten Lebensdauer des Prozesses vorhanden.

0
Andrew Bezzub