C # privado, estático y solo de lectura


Estaba revisando algún código para log4net y me encontré con esto.

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

Me pregunto por qué necesitaría tener estática privada readonly.

Desde mi punto de vista private significaría que la variable no se puede usar fuera de la clase a menos que haya un método accessor o una propiedad get.

Static significaría que la variable solo tiene ámbito en este archivo.

Readonly significaría que solo puede leer desde el valor y no puede asignar se.

Por lo tanto, estoy pensando que la persona que escribió este código. lo declararon privado ya que no quieren que se use fuera de la clase y estático por lo que no quieren que se use fuera del archivo. Sin embargo, si hay una propiedad get estática evitaría que esta forma suceda.

Creo que puedo entender readonly y el valor solo se debe leer desde y no establecer.

Muchas gracias por cualquier consejo,

Author: victor hugo, 2009-06-09

9 answers

  • private Nadie debe usar el campo logger fuera de la clase (incluso en subclases), si no establece esto, cualquier otra clase podría usar su logger para iniciar sesión en el nombre de su clase.
  • static El atributo adjunto a la clase por lo que no repetir con cada instancia de la clase. Si no establece esto, el atributo logger ocupará espacio adicional en la memoria con cada instancia que el sistema haga del objeto (entendió mal este).
  • readonly El campo logger no debe ser modificado.
 45
Author: victor hugo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-08 02:10:50

Creo que estás malinterpretando la estática. Estática no significa "no se puede utilizar fuera del archivo."Estático significa: hay uno por clase. Lo que hace esta declaración es crear un logger que solo se asigna una vez (estático), solo está disponible en la clase (no en las clases derivadas tampoco) (privada), y no se puede escribir más allá de su inicialización (solo lectura).

Buena pregunta sin embargo!

 9
Author: Stefan Mai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-09 04:33:04

Static significa no que no se puede acceder desde otros archivos - esto no es C. La palabra clave Static significa que el objeto logger es una variable de clase en lugar de una variable de instancia, por lo que incluso cuando se accede desde diferentes objetos de esa clase, todos se referirán al mismo objeto logger.

 6
Author: Tal Pressman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-09 04:32:55

Estático en c# significa que el miembro está asociado con la clase, y no con una instancia de la clase. Readonly es importante porque en c# la mayoría de las variables, y esta en particular, son variables de referencia. El readonly significa que esta variable siempre hará referencia al mismo registrador.

 2
Author: Robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-09 04:45:32

Lo que el desarrollador está diciendo es que cuando llaman logger.Info (.) en cualquier instancia de esta clase quieren usar una instancia común (estática) (así que no necesitan crear un nuevo logger por instancia de clase), quieren estar seguros de que no ha cambiado desde que se creó (readonly) y si estamos en función virtual en una clase derivada, entonces quiero asegurarme de que no uso la clase base uno por error (privada).

 2
Author: Colin Desmond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-09 08:52:45

Una variable readonly es muy similar a const en que el valor es constante a lo largo de su vida útil. La diferencia es que una variable readonly se inicializa en tiempo de ejecución y const en tiempo de compilación. Static, en términos sencillos, significa que la instancia de la variable no depende de la instancia del objeto en el que se declara. Su vida útil persiste de llamada a función a llamada a función. El acceso a una variable estática es más rápido porque su almacenamiento permanece asignado durante toda la duración del programa. Así que sabiendo esto podemos volver a su pregunta.

¿Por qué 'logger' es un miembro estático? Es una decisión de diseño. Necesito saber cómo lo estás usando para responder a esta pregunta. ¿Por qué es sólo lectura? Porque parece que se inicializa una vez y su instancia se utiliza en todo. Podemos asegurarnos de que nadie más manipule el valor de logger haciéndolo 'solo lectura' justo después de inicializarlo.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-09 04:59:24

La razón para poner un indicador de solo lectura en una variable privada es declarar que la variable siempre hará referencia al mismo objeto. Es cierto que ser privado lo hace invisible para cualquier persona fuera de la clase, pero de esta manera podemos asegurarnos de que no sobrescribimos accidentalmente la variable con un nuevo objeto, escribiendo algo como

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

En otro lugar de nuestra clase. Con readonly simplemente no compilará (A menos que no se inicializara antes, y estamos en el (estático) constructor)

 1
Author: Noam Gal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-09 09:03:03

Las variables estáticas caen en la categoría de "variables de clase", una variable de clase es una que está asociada con la clase en lugar del objeto de clase, por otro lado las variables de instancia son variables que están asociadas con el objeto de clase significa que cada vez que se inicia un objeto de clase, este objeto tendrá su propia copia de esa "Variable de instancia" (no estática) mientras que la variable estática se comparte entre todos los objetos de clases en el programa en ejecución, como el tamaño de la lista vinculada, etc. readonly es la palabra clave c# que se utiliza para hacer una variable readonly, java no proporciona tal facilidad tienes que escribir un método público para acceder a las variables que no quieres templar.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-09 18:06:26

Lo siento, sé que esto ya ha sido respondido y es muy antiguo, pero quería que cualquiera que se encuentre con este artículo sepa que así es como se configura un patrón " Singleton". Cualquiera que quiera saber más sobre el ejemplo de código en la pregunta probablemente se beneficiará de aprender más sobre Singletons y cómo se usan (mediadores, registradores, devoluciones de llamada asincrónicas, etc.).).

/ / cosas de la nave nodriza sobre singletons
http://msdn.microsoft.com/en-us/library/ff650316.aspx
http://msdn.microsoft.com/en-us/library/ff650849.aspx

/ / una gran discusión sobre ellos
¿Qué tienen de malo los singletons?

 0
Author: jpdedmon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:09