2011-05-10 30 views
23

Hoy tuve una conversación con mi colega y concluí los siguientes puntos. Por favor, arroje algo de luz si todo es correcto o si se requiere alguna modificación.inicialización de variables estáticas

  1. Cuando constructor estático no está definido en la clase, los campos estáticos se inicializan justo antes de su uso.
  2. Cuando constructor estático se define en la clase, los campos estáticos se inicializan justo antes de su uso o como parte de (antes) la creación de instancias.
  3. Si no se accede a ningún campo estático dentro de un método estático y se llama a ese método estático. los campos estáticos se inicializarán solo si el constructor estático está definido en esa clase.
  4. Si es posible, debe evitarse el constructor estático en una clase.
+1

¿Qué quiere decir con "variables estáticas", Propiedades? ¿Campos? No puede declarar una variable dentro de un método como estática. –

+1

sí, en C#, las variables estáticas no se declaran dentro del método. por variables estáticas quiero decir campos. He actualizado la pregunta. – Azodious

Respuesta

7

1.-3.No puede saber exactamente cuándo sucede y por lo tanto no puede confiar en ello. Un constructor estático le dará un poco de control de lo que sucede cuando se llama.

public class UtilityClass 
{ 
    // 
    // Resources 
    // 

    // r1 will be initialized by the static constructor 
    static Resource1 r1 = null; 

    // r2 will be initialized first as static constructors are 
    // invoked after the static variables are initialized 
    static Resource2 r2 = new Resource2(); 

    static UtilityClass() 
    { 
    r1 = new Resource1(); 
    } 

    static void f1(){} 
    static void f2(){} 
} 

constructores 4.Static son lentos

El momento exacto de la ejecución constructor estático es dependiente de la implementación, pero está sujeto a las siguientes reglas:

  • El constructor estático para una clase se ejecuta antes de que se cree cualquier instancia de la clase .
  • El constructor estático para una clase se ejecuta antes de que cualquiera de los miembros estáticos para la clase sean
    a los que se hace referencia.
  • El constructor estático para una clase ejecuta después de que los inicializadores de campo estático (si los hay) para la clase.
  • El constructor estático para una clase ejecuta, a lo sumo, una vez durante una sola ejemplificación programa.
  • El orden de ejecución entre dos constructores estáticos de dos
    diferentes clases no está especificado.
+0

pero debe existir alguna descripción sobre esto. y quiero saber si estos puntos son lógicos y así es como funciona CLR? – Azodious

+0

-1 Por supuesto, usted sabe cuándo se llama un ctor estático. A saber, cuando se crea la primera instancia de la clase o cuando se accede a cualquier miembro estático (método, campo) por primera vez. – Christian

+0

Estás escribiendo, está mal escrito ... Lo he corregido – sra

4

todos los puntos son correctos.

La razón constructores estáticos deben evitarse es porque el compilador inyecta código en todas partes cualquier método de la clase se llama para comprobar que el constructor estático ha sido llamado. Esto tiene un impacto negativo en el rendimiento.

Lo que puede hacer es tener un campo estático privado en que la clase que se asigna un valor ficticio cuando el defecto (o de otro tipo no estática) se llama al constructor. Esto inicializa todos los campos estáticos en la creación de objetos.