C # privé, statique, et en lecture seule

j'étais en train d'examiner un code pour log4net et je suis tombé sur ceci.

private static readonly ILog logger = LogManager.GetLogger(typeof(AdminClient));

je me demande pourquoi vous auriez besoin d'avoir des parasites privés en lecture seule.

d'après ce que j'ai compris, private signifierait que la variable ne peut pas être utilisée à l'extérieur de la catégorie à moins qu'il y ait une méthode d'accesseur ou d'obtenir une propriété.

statique signifierait que la variable est scoped seulement dans ce fichier.

ne ferait que lire signifie que vous ne pouvez lire que la valeur et ne pouvez pas l'attribuer.

Donc, je pense que la personne qui a écrit ce code. déclaré privé car ils ne veulent pas qu'il soit utilisé en dehors de la classe et statique de sorte que ne veulent pas qu'il soit utilisé en dehors du fichier. Cependant, s'il y a une propriété get static prévient que cette forme se produit.

je pense que je peux comprendre readonly et la valeur est seulement à lire et pas ensemble.

Merci beaucoup pour tout conseil,

24
demandé sur victor hugo 2009-06-09 08:28:29

9 réponses

  • privé personne ne devrait utiliser le champ logger en dehors de la classe (même dans les sous-classes), si vous ne définissez pas cette autre classe, n'importe quelle autre classe pourrait utiliser votre logger pour se connecter dans le nom de votre classe.
  • statique l'attribut est attaché à la classe de sorte qu'il ne sera pas répéter avec chaque instance de la classe. Si vous ne le définissez pas, l'attribut logger occupera plus d'espace dans mémoire avec chaque instance que le système fait de l'objet (vous avez mal compris cela).
  • readonly le champ logger ne doit pas être modifié.
45
répondu victor hugo 2011-11-08 02:10:50

je pense que vous êtes un malentendu statique. Statique "ne signifie pas" ne peut pas être utilisé en dehors du fichier."Statique signifie: Il y en a un par classe. Ce que fait cette déclaration est de créer un logger qui n'est attribué qu'une seule fois (statique), disponible uniquement dans la classe (pas dans les classes dérivées non plus) (privé), et ne peut pas être écrit au-delà de son initialisation (en lecture seule).

bonne question!

9
répondu Stefan Mai 2009-06-09 04:33:04

static does not mean that it cannot be accessed from other files - this isn'T C. Le mot-clé statique signifie que l'objet logger est une variable de classe au lieu d'une variable d'instance, donc même lorsqu'il est accédé à partir de différents objets de cette classe, ils se référeront tous au même objet logger.

6
répondu Tal Pressman 2009-06-09 04:32:55

statique en c# signifie que le membre est associé à la classe, et pas avec une instance de la classe. Readonly est important parce que dans c# la plupart des variables, et celle-ci en particulier, sont des variables de référence. Cela signifie que cette variable se référera toujours au même logger.

2
répondu Robert 2009-06-09 04:45:32

ce que le développeur dit est que quand ils appellent logger.Info ( ... ) dans n'importe quelle instance de cette classe ils veulent utiliser une instance (statique) commune (donc pas besoin de créer un nouveau logger par instance de classe), ils veulent être certains qu'elle n'a pas changé depuis qu'elle a été créée (en lecture seule) et si nous sommes dans une fonction virtuelle dans une classe dérivée alors je veux m'assurer que je n'utilise pas la classe de base un par erreur (privé).

2
répondu Colin Desmond 2009-06-09 08:52:45

a readonly variable est très semblable à const en ce que la valeur est constante tout au long de sa vie. La différence est qu'une variable readonly est initialisée à l'exécution et const est à la compilation. Statique , sorte de termes profanes, signifie que l'instance de la variable ne dépend pas de l'instance de l'objet sur lequel elle est déclarée. Sa durée de vie s'étend de l'appel de fonction à l'appel de fonction. Une variable statique est plus rapide à accès parce que son stockage reste alloué pour toute la durée du programme. Donc, sachant cela, nous pouvons revenir à votre question.

pourquoi logger est-il un membre statique? C'est une décision de conception. J'ai besoin de savoir comment vous l'utilisez pour répondre à cette question. Pourquoi est-il en lecture seule? Parce qu'il semble qu'il soit initialisé une fois et son instance est utilisée tout au long. Nous pouvons nous assurer que personne d'autre n'altère la valeur de l'enregistreur en faisant "lecture seule" juste après, nous initialisons il.

1
répondu 2009-06-09 04:59:24

la raison de mettre un drapeau readonly sur une variable privée est de déclarer que la variable référencera toujours le même objet. Il est vrai qu'être privé le rend invisible pour n'importe qui en dehors de la classe, mais de cette façon nous pouvons nous assurer que nous n'avons pas accidentellement écraser la variable avec un nouvel objet, en écrivant quelque chose comme

logger = LogManager.GetLogger(typeof(AdminClient));

ailleurs dans notre classe. Avec readonly, il ne compilera pas (sauf s'il n'a pas été initialisé avant, et nous sommes dans le constructeur (statique)

1
répondu Noam Gal 2009-06-09 09:03:03

les variables statiques tombent dans la catégorie des "variables de classe", une variable de classe est une qui est associée à la classe au lieu de l'objet de classe, d'autre part les variables d'instance sont des variables qui sont associtées avec l'objet de classe signifie Chaque fois qu'un objet de classe est intialized cet objet aura sa propre copie de cette "Variable D'Instance" (non statique) tandis que la variable statique est partagée entre tous les objets de classes dans le programme courant comme la taille de la liste liée, etc. readonly est c# mot-clé est utilisé pour faire une variable en lecture seule, java ne fournit pas une telle facilité, vous devez écrire une méthode publique pour accéder aux variables dont vous ne voulez pas être trempé.

1
répondu 2009-09-09 18:06:26

Désolé, je sais que cela a déjà été répondu et il est vraiment vieux, mais je voulais faire savoir à quiconque vient à travers cet article que c'est la façon dont vous avez mis en place un " Singleton " modèle. Toute personne qui veut en savoir plus sur l'exemple de code dans la question aura probablement avantage à en apprendre davantage sur les Singletons et la façon dont ils sont utilisés (médiateurs, loggers, async callbacks, etc.).

/ / truc de vaisseau mère sur les singletons

http://msdn.microsoft.com/en-us/library/ff650316.aspx

http://msdn.microsoft.com/en-us/library/ff650849.aspx

// une grande discussion à propos de

Ce qui est si mal à propos de singletons?

0
répondu jpdedmon 2017-05-23 11:54:09