2009-06-09 16 views
23

Estaba revisando un código para log4net y me encontré con esto.C# privado, estático y de solo lectura

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

Me pregunto por qué necesitarías tener un estático privado de solo lectura.

Según 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 get.

estático significa que la variable tiene un alcance solo en este archivo.

readonly significa que solo puede leer el valor y no puede asignarlo.

Entonces, estoy pensando que la persona que escribió este código. lo declararon privado ya que no lo quieren usado 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, esto evitaría que esto ocurra.

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

Muchas gracias por cualquier consejo,

+0

Un dato interesante sobre este patrón específico: Una vez declarado esto como 'protegida static readonly' y eso me valió un "[CA2104] (https://msdn.microsoft.com/en-us/library/ms182302.aspx): No declare los tipos de referencia de solo lectura mutable" advertencia de VS Code Analysis. Como se mencionó [aquí] (http://stackoverflow.com/a/15745885/268066), "Un campo' protected readonly' no es tan claro. Como 'protected', se puede esperar que una clase derivada pueda inicializar el campo" Cambiando la declaración a' private static readonly' solucionado esto – CrazyPyro

Respuesta

45
  • privada 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 ingrese el nombre de su clase.
  • estática El atributo es unidos a la clase por lo que no repetición con cada instancia de la clase. Si no configura esto, el atributo del registrador ocupará espacio extra en la memoria con cada instancia que el sistema haga del objeto (usted no entendió esto).
  • readonly El campo del registrador no se debe modificar.
+0

nice, dejó todo muy claro aquí –

+0

el enlace que ha publicado está muerto – Natrium

6

estática no no quiere decir 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 se referirán al mismo objeto logger.

9

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

¡Buena pregunta!

2

estática 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 solo significa que esta variable siempre hará referencia al mismo registrador.

1

A readonly variable es muy similar a const en que el valor es constante a lo largo de su vida útil. La diferencia es que una variable de solo lectura se inicializa en tiempo de ejecución y const está en tiempo de compilación.Estático, en términos de términos simples, significa que la instancia de la variable no depende de la instancia del objeto en el que está declarada. Su duración persiste desde la llamada de función a la llamada a 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. Entonces, sabiendo esto, podemos volver a tu pregunta.

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

2

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 función virtual en una clase derivada, entonces quiero asegurarme de que no use la clase base uno por error. (privado).

1

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 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)); 

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))

1

Las variables estáticas cae en la categoría de "variables de clase", una variable de clase es la que son asociado con clase en lugar de objeto de clase, por otro lado las variables de instancia son variables que se asocian con objeto de clase significa que cada vez que se inicializa un objeto de clase este objeto tendrá su propia copia de esa "Variable de instancia" (no estática) mientras 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 no proporciona tal facilidad, tienes que escribir un método público para acceder a variables que no quieres templado.

0

Lo siento, sé que esto ya se ha respondido y es realmente antiguo, pero quería que cualquiera que conozca este artículo sepa que así es como configuraste un patrón "Singleton". Cualquier persona que quiera saber más sobre el ejemplo de código en la pregunta probablemente se beneficie al aprender más sobre Singletons y cómo se usan (mediadores, registradores, 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
What is so bad about singletons?

Cuestiones relacionadas