una que propiedades propiedad programacion metodos entre diferencia clase campo accesores c# log4net access-modifiers

c# - que - propiedades en programacion



C#privado, estático, y solo lectura (9)

Estaba revisando un código para log4net y encontré esto.

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

Me pregunto por qué necesitarías tener la estática privada de solo lectura.

A mi entender, privado significaría que la variable no se puede usar fuera de la clase a menos que haya un método de acceso o una propiedad.

estática significaría que la variable solo está dentro del alcance de este archivo.

readonly significaría que solo puede leer desde el valor y no puede asignarlo.

Por lo tanto, estoy pensando que la persona que escribió este código. lo declaró privado, ya que no quiere que se use fuera de la clase y estático, de modo que no quiera que se use fuera del archivo. Sin embargo, si hay una propiedad de obtención, la estática evitaría que este formulario pasara.

Creo que puedo entender solo lectura y el valor solo debe leerse y no establecerse.

Muchas gracias por cualquier consejo,


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

Buena pregunta aunque!


La razón para poner una marca 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 no sobrescribir la variable por un nuevo objeto accidentalmente, escribiendo algo como

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

En otro lugar en nuestra clase. Con readonly simplemente no se compilará (a menos que no se haya inicializado antes, y estemos en el constructor (estático))


Las variables estáticas caen en la categoría de "variables de clase", una variable de clase es aquella que está asociada con la clase en lugar del objeto de clase, por otro lado las variables de instancia son variables que se asocian con el objeto de clase significa que cada vez que un objeto de clase se inicializa 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 las clases en el programa en ejecución, como el tamaño de la lista enlazada, etc. readonly es la palabra clave c # que se usa para hacer una variable de solo lectura, java doesnt proporcione tal facilidad que tiene que escribir un método público para acceder a las variables que no desea que se atempere.


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


Lo siento, sé que esto ya se ha respondido y es muy antiguo, pero quería que todos los que se encuentren en este artículo sepan que esta es la forma en que se configura un patrón " Singleton ". Cualquier persona 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 llamadas asíncronas, 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 SO sobre ellos
¿Qué tiene de malo el singleton?


Una variable de solo lectura es muy parecida a la constante en que el valor es constante durante toda su vida útil. La diferencia es que una variable de solo lectura se inicializa en tiempo de ejecución y la constante en tiempo de compilación. Estático , en términos de laicos, significa que la instancia de la variable no depende de la instancia del objeto en el que se declara. Su vida útil persiste de la llamada de función a la llamada de función. Una variable estática es más rápida de acceder porque 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 lo usas para responder esta pregunta. ¿Por qué es de solo lectura? Porque parece que se inicializó una vez y su instancia se utiliza en todo. Podemos asegurarnos de que nadie más manipule el valor del registrador haciéndolo "solo lectura" justo después de que lo iniciemos.


estática no significa que no se pueda acceder a ella desde otros archivos; esto no es C. La palabra clave estática significa que el objeto de registrador es una variable de clase en lugar de una variable de instancia, por lo que incluso cuando se acceda desde diferentes objetos de esa clase, todos se refieren al mismo objeto logger.


static 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 valor de solo lectura significa que esta variable siempre hará referencia al mismo registrador.


  • privado Nadie debe usar el campo del registrador fuera de la clase (incluso en subclases), si no configura esto, cualquier otra clase podría usar su registrador para registrar el nombre de su clase.
  • estático El atributo se adjunta a la clase para que no se repita con cada instancia de la clase. Si no configura esto, el atributo del registrador ocupará espacio adicional en la memoria con cada instancia que el sistema haga del objeto (usted lo malinterpreta).
  • readonly El campo logger no debe ser modificado.