C # variables statiques-portée et persistance

je viens de faire une petite expérience:

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

et puis j'ai couru:

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

les résultats auxquels je m'attendais étaient 0, 3, 0, 10, 0.

à ma grande surprise, 0, 3, 3, 10, 10.

Combien de temps ces changements persistent? La durée de l'exécution du programme? La durée de la fonction appelant la méthode statique?

28
demandé sur Ozzah 2011-05-13 04:31:55

9 réponses

ils persisteront pour la durée de AppDomain . Les changements apportés à la variable statique sont visibles d'une méthode à l'autre.

MSDN:

si une variable locale est déclarée avec le mot-clé statique, sa durée de vie est plus longue que le temps d'exécution de la procédure dans laquelle elle est déclarée. Si la procédure est à l'intérieur d'un module, la variable statique survit tant que votre demande continue de courir.

voir ci-après pour plus de détails:

42
répondu YetAnotherUser 2011-05-13 00:40:34

les résultats auxquels je m'attendais étaient 0, 3, 0, 10, 0.

à ma grande surprise, 0, 3, 3, 10, 10.

Je ne suis pas sûr que vous vous attendiez à ce que la variable statique revienne à sa valeur originale après avoir été changée à l'intérieur de la méthode Foo(int). Une variable statique persisteront sa valeur tout au long de la durée de vie du processus et existent par classe, pas l'instance.

27
répondu Ed S. 2011-05-13 00:36:03

si c'est une variable statique, cela signifie qu'il existe exactement un endroit dans la mémoire pour la durée du programme.

6
répondu Chris Eberle 2011-05-13 00:34:52

selon le C# spec, une variable statique sera initialisée au plus tard la première fois qu'une classe est chargée dans un AppDomain, et existera jusqu'à ce que ce AppDomain soit déchargé - généralement lorsque le programme se termine.

4
répondu Ben 2011-05-13 00:37:48

Pour la durée de l'exécution du programme.

les variables de classe statiques sont comme des globals. Ils ne sont pas connectés à des objets spécifiques d'une classe - il n'y a qu'une seule instance par programme. Les seules variables qui vivent pendant le temps d'exécution de la fonction sont les variables automatiques (locales) de la fonction.

3
répondu Seva Alekseyev 2011-05-13 00:35:13

il persiste pendant la durée de l'exécution du programme, ou jusqu'à ce que vous l'écrasiez avec une autre valeur. Si vous voulez faire le résultat comme vous voulez qu'il soit, vous devez spécifier myInt = 0 dans le constructeur avant de retourner myInt;

1
répondu Viken Ong 2011-05-13 01:04:48

vos changements de portée statique vivront aussi longtemps que votre application""

0
répondu Marek 2011-05-13 00:38:12

les variables statiques appartiennent au type, pas à son instance. Et habituellement (si vous ne créez pas plusieurs domaines app) les objets de type sont chargés une seule fois et existent pendant la durée du processus.

0
répondu Andrew Bezzub 2011-05-13 00:39:10

Ils persistent " pour la durée de vie du domaine d'application dans lequel votre programme réside selon Microsoft Docs: Statique des Classes et les Membres de Classe Statiques (Guide de Programmation C#) .

voir aussi:

0
répondu weir 2018-03-13 14:40:16