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?
3 Réponses :
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.
cet accessoire privé
a été la partie déroutante pour moi, merci de l'avoir clarifié.
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); }
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
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.
Merci pour l'explication détaillée.
Si la classe contenant est
static
ou non, cela n'a absolument aucun effet sur un membrestatic
.static
signifiestatic
, 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