3
votes

Portée de la variable statique privée dans une classe non statique

Je sais qu'une propriété statique peut conserver sa valeur tant que l'application reste en cours d'exécution. Sera-ce la même chose pour un champ statique privé à l'intérieur de la classe non statique

public class A
{
   private static int B;

   public int GetSession()
   {
     return B++;
   }
}

Dans la classe ci-dessus, j'ai un champ statique privé. L'appel de la méthode GetSession () fournira-t-il le nombre de fois où GetSession () accède?


4 commentaires

Si la classe contenant est static ou non, cela n'a absolument aucun effet sur un membre static . static signifie static , ceci est partagé entre toutes les instances . En dehors de cela, vous pouvez simplement l'essayer en créant différentes instances et voir si toutes ont la même valeur pour votre champ statique.


"Dans la classe ci-dessus, j'ai une propriété statique privée" non, vous avez un champ statique privé


@HimBromBeere, compris, merci pour l'info.


@Rango, a mis à jour la question. :) Merci pour l'info


3 Réponses :


1
votes

Oui, il renverra toujours le nombre de fois où B a été accédé. C'est toujours statique . L'ajout de privé ne change pas cela. Et rendre la classe statique signifie qu'un objet ne peut pas être instancié pour cette classe, par conséquent, tout dans la classe devrait être statique . Mais la variable se comportera toujours de la même manière.


1 commentaires

cet accessoire privé a été la partie déroutante pour moi, merci de l'avoir clarifié.



2
votes

Puisque B est statique , il sera partagé entre toutes sessions; l'implémentation thread-safe (que se passe-t-il si deux sessions essaient d'y accéder / incrémenter simultanément ?) est

   public int GetSession()
   {
       // - 1 Since we want to emulate B++ (value before incrementing), not ++B
       return Interlocked.Increment(ref B) - 1;
   }

Modifier: Si nous voulons émuler B ++ , pas ++ B (et renvoyer B avant l'incrémentation - voir le commentaire de Jeppe Stig Nielsen) nous pouvons juste sous-traiter 1:

   public int GetSession()
   {
       return Interlocked.Increment(ref B);
   }


2 commentaires

Son code d'origine avait return B ++; , pas return ++ B; . Veut-il que la valeur incrémentée soit renvoyée, ou la valeur avant l'incrémentation?


@Jeppe Stig Nielsen: Belle prise! Je vous remercie! Probablement, le moyen le plus simple d'émuler B ++ au lieu de ++ B est de soustraire 1



2
votes

Oui, il fournira le nombre de fois que la méthode GetSession () a été appelée.

Ce sera le total de toutes instances de A .

Notez que ce n'est pas thread-safe, donc si votre application a plusieurs threads appelant potentiellement GetSession () simultanément, le décompte peut être erroné. Voir la réponse de Dmitry Bychenko. Ce n'est pas un problème si toutes vos instances de A sont appelées à partir du même thread.

Notez également que si votre application a plusieurs AppDomains, chaque AppDomain aura un champ statique distinct. Ainsi, il ne compte que les appels depuis le même AppDomain, quelle que soit l'instance par laquelle les appels sont passés.


1 commentaires

Merci pour l'explication détaillée.