Pregunta

estaba revisando algo de código para log4net y me encontré con esto.

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

Me pregunto ¿por qué es necesario tener sólo lectura estática privada.

A mi entender privada significaría que la variable no no se puede utilizar fuera de la clase a menos que haya un método de acceso o conseguir la propiedad.

estática significaría que la variable está en el ámbito sólo en este archivo solamente.

de sólo lectura que significaría que sólo se puede leer desde el valor y no puede asignar la misma.

Por lo tanto, pienso que la persona que escribió el código. declarado en privado, ya que no desea que se utilicen fuera de la clase y estático para que no desea que se utilicen fuera del archivo. Sin embargo, si hay una propiedad get sería estática a prevenir esta forma sucediendo.

Creo que puedo entender de sólo lectura y el valor es sólo para ser leído desde y no ajustado.

Muchas gracias por cualquier consejo,

¿Fue útil?

Solución

  • privado nadie debe utilizar el campo registrador fuera de la clase (incluso en las subclases), si no se establece esta cualquier otra clase podría utilizar su registrador para viga en el nombre de la clase.
  • estática El atributo es adjunto a la clase por lo que no repetición con cada instancia de la clase. Si no se establece este atributo registrador ocupará más espacio en la memoria con todos los casos el sistema hace del objeto (que mal entendido esto).
  • de sólo lectura El campo registrador no debe ser modificado.

Otros consejos

Creo que estás malentendido estática. Estática no significa "no puede ser utilizado fuera del archivo." Estática significa: hay uno por clase. Lo que esta declaración hace es crea un registrador que sólo se asigna una vez (estática), sólo está disponible en la clase (no en las clases derivadas tampoco) (privado), y no se puede escribir en el pasado su inicialización (sólo lectura).

Buena pregunta, sin embargo!

estática hace no significa que no se puede acceder desde otros archivos - esto no es C. La palabra clave estática significa que el objeto registrador 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 ellos se refieren al mismo objeto logger.

estática en c # significa que el miembro se ha asociado con la clase, y no con una instancia de la clase. De sólo lectura es importante porque en C # mayoría de las variables, y éste en particular, son las variables de referencia. El sólo lectura significa que esta variable siempre hará referencia a la misma logger.

Lo que el desarrollador está diciendo es que cuando llaman logger.Info (...) en cualquier instancia de esta clase que quieren utilizar una instancia común (estática) (por lo que no es necesario crear un nuevo registrador por clase ejemplo), quieren estar seguros de que no ha cambiado desde que fue creado (sólo lectura) y si estamos en función virtual en una clase derivada, entonces quiero para asegurarse de que yo no uso la clase base uno por error ( privado).

A sólo lectura variable es muy parecido a const en que el valor es constante a lo largo de su vida útil. La diferencia es que una variable de sólo lectura se inicia en tiempo de ejecución y const es en tiempo de compilación. estático , en una especie de términos de los laicos, significa que la instancia de la variable no depende de la instancia del objeto que se declara en. Su vida útil de la llamada persiste una función a otra llamada. Una variable estática es más rápido que el acceso debido a su almacenamiento permanece asignado durante toda la duración del programa. Así que sabiendo esto podemos volver a su pregunta.

¿Por qué es 'logger' un miembro estático? Esa es una decisión de diseño. Necesito saber cómo se está usando para responder a esta pregunta. ¿Por qué es de sólo lectura? Debido a que parece que ha inicializado una vez y su ejemplo se utiliza en todo. Podemos asegurarnos de que nadie más altere el valor del registrador por lo que es 'sólo lectura' justo después de inicializar la misma.

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

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

en otro lugar en nuestra clase. Con sólo lectura simplemente no va a compilar (a menos que no se ha inicializado antes, y estamos en el constructor (estática))

Las variables estáticas cae en la categoría de "variables de clase", una variable de clase es una que se asocia con la clase en lugar de objeto de clase, por otro lado variables de instancia son variables que se associted con objeto de clase significa que cada vez que un objeto de clase es inicializado este objeto tendrá su propia copia de la "Instancia variable" (no estática), mientras que la variable estática se comparte entre todos los objetos de clases en el programa que se ejecuta como el tamaño de la lista enlazada, etc. de sólo lectura es c # palabra clave que se utiliza para hacer una variable de sólo lectura, no logra java proporcionar dicha instalación tiene que escribir un método público a acceder a las variables que usted no quiera conseguir templado.

Lo siento, sé que esto ya ha sido contestada y es muy viejo, pero yo quería que todo aquel que viene a través de este artículo sabe que así es como se configura un " Singleton " patrón. Cualquier persona que quiera saber más sobre el ejemplo de código en la pregunta que seguramente se beneficiará de aprender más acerca de Singleton y cómo se utilizan (mediadores, madereros, devoluciones de llamada asincrónicas, etc.).

// nodriza cosas sobre embarazos únicos
http://msdn.microsoft.com/en-us/library/ff650316. aspx
http://msdn.microsoft.com/en-us/library/ff650849. aspx

// una discusión acerca de ellos gran SO
¿Qué hay de malo en embarazos únicos?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top