web-dev-qa-db-fra.com

Variables statiques C # - 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 que j'attendais étaient 0, 3, 0, 10, 0.

À ma grande surprise, j'ai eu 0, 3, 3, 10, 10.

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

30
Ozzah

Ils persisteront pendant la durée de AppDomain . Les modifications apportées à la variable statique sont visibles d'une méthode à l'autre. 

MSDN:

Si une variable locale est déclarée avec le mot-clé Static, sa durée de vie est supérieure à la durée d'exécution de la procédure dans laquelle elle est déclarée. Si la procédure se trouve dans un module, la variable statique survit tant que votre application continue de s'exécuter.

Voir ci-dessous pour plus de détails:

45
YetAnotherUser

Les résultats que j'attendais étaient 0, 3, 0, 10, 0.

À ma grande surprise, j'ai eu 0, 3, 3, 10, 10.

Je ne sais pas pourquoi vous vous attendriez à ce que la variable statique retrouve sa valeur d'origine après avoir été modifiée depuis la méthode Foo (int). Une variable statique conservera sa valeur tout au long du cycle de vie du processus et une seule existera par classe et non par instance.

27
Ed S.

Si c'est une variable statique, cela signifie qu'il existe exactement une place en mémoire pour la durée du programme.

6
Chris Eberle

Selon la spécification C #, une variable statique sera initialisée au plus tard au premier chargement d’une classe dans un AppDomain et existera jusqu’à ce que cet AppDomain soit déchargé - généralement à la fin du programme.

5
Ben

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

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

4
Seva Alekseyev

Il persiste pendant toute la durée de l'exécution du programme ou jusqu'à ce que vous l'écrasiez avec une autre valeur. Si vous voulez obtenir le résultat que vous souhaitez, vous devez spécifier myInt = 0 dans le constructeur avant de renvoyer myInt;

1
Viken Ong

Ils persistent "pendant toute la durée du domaine d'application dans lequel votre programme réside" selon Microsoft Docs: classes statiques et membres de classes statiques (Guide de programmation C #) .

Voir également:

1
weir

Vos modifications dans la portée statique dureront aussi longtemps que votre application

0
Marek

Les variables statiques appartiennent à type, pas à son instance. Et généralement (si vous ne créez pas plusieurs domaines d'application), les objets de type ne sont chargés qu'une seule fois et existent pendant la durée du processus.

0
Andrew Bezzub