2010-06-09 16 views
5

vi este tipo de código en el trabajo:¿Qué significa un modificador estático en un constructor?

class FooPlugin : IPlugin // IPlugin is a Microsoft CRM component, it has something special about it's execution 
{ 
    static FooPlugin() 
    { 
    SomeObject.StaticFunction(); // The guy who wrote it said it's meaningful to this question but he can't remember why. 
    } 
} 

Alguna idea de lo que hace un modificador static en un constructor significa y por qué en este caso se requiere?

+1

en realidad, no se permiten todos los modificadores en un constructor estático, por lo que será solo FooPlugin estático(). También esto se invoca automáticamente, y no hay forma de ejecutarlo bajo demanda. – SWeko

+0

@SWeko: Es malo que tengas razón, olvidé exactamente qué había allí. –

Respuesta

6

Esta es la inicialización estática de la clase.

Se llamaría cuando utiliza un método, un campo, una propiedad o cualquier otra cosa de la clase. En otras palabras, se llamaría la primera vez que usas la clase.

Ver static constructors on MSDN

También puede inicializar cosas estática aquí.

En su ejemplo parece que quien escribió que quería llamar SomeObject.StaticFunction() una vez antes de la gente utilizará FooPlugin, por lo que probablemente va a ser inicializado antes de usar FooPlugin.

Tenga en cuenta que se produce cierto impacto en el rendimiento cuando lo utiliza y Visual Studio (mediante el análisis de código) puede hacerle saber que es mejor inicializar los campos estáticos en línea.

Ver CA1810: Initialize reference type static fields inline on MSDN

+0

Una vez más, ¿qué significa? Aún no sé C#. En C++ no puedes hacer algo como esto. –

+0

Respuesta correcta, pero estoy un poco confundido por 'público' en esa declaración. Siempre recibí un error en tiempo de compilación cuando accidentalmente especificaba el modificador de acceso en un constructor estático. ¿Cambió en C# 4.0? –

+2

@the_drow: saca C++ de tu cabeza, tu vida mejorará de inmediato. El constructor estático es un método que se llama exactamente una vez, la primera vez que intenta usar la clase. ¿Qué no está claro aquí? –

3

Define el constructor estático para el objeto.

Un constructor estático se utiliza para inicializar cualquier datos estáticos, o para realizar una acción particular que necesite realiza sólo una vez. Se llama automáticamente antes de que se cree la primera instancia o se hace referencia a cualquier miembro estático.

Ver más en MSDN - Static Constructors (C#)

+0

Duh, pero ¿qué significa exactamente? –

+1

@the_drow - Duh. Para eso es el enlace. Pero publiqué la cita relevante de MSDN. –

0

A static constructor se utiliza para inicializar-clase ancha (es decir static) miembros, a diferencia de los miembros de instancia.

3

No puedo decir por qué se requiere en su caso particular, pero la motivación para un constructor estático es normalmente uno de estos:

  1. Todas las instancias de la clase necesitan acceso a la misma instancia de una objeto o
  2. inicialización de algún objeto externo es un requisito previo para todas las instancias de la clase (parece que el caso en su ejemplo) o
  3. inicialización de alguna estructura de datos o servicio se toma demasiado tiempo para hacer repetidamente (un vari ación del primer caso).
+0

Eso es # 2. Ahora lo entiendo. Esa función inicializa algo dentro del ORM. –

+1

Si proviene de un fondo C++, aquí se explica el equivalente en C++: http://stackoverflow.com/questions/1197106/static-constructors-in-c-need-to-initialize-private-static-objects – JasonTrue

0

sólo para añadir a las respuestas anteriores, constructor estático (o bloques estáticos como en el caso de Java) se ejecutan una sola vez cuando la clase es primera carga en la memoria. El objetivo es inicializar campos estáticos, que de lo contrario asumirían el valor predeterminado respectivo del tipo de datos.A veces utilizo constructores estáticos para construir un modelo de objeto que deseo utilizar a lo largo de la vida de la aplicación.

1

Aquí hay un ejemplo más simple de cuando un constructor estático es útil. La siguiente clase tiene algunos campos estáticos. El primero puede inicializarse en línea con su declaración, pero el segundo no puede. Constructor estático al rescate La garantía clave que proporciona es que no se puede acceder a ninguna parte de la clase antes de que se ejecute el código de inicialización.

class NeedsStaticConstructor 
{ 

    private static Size s_size = new Size(100, 100); // can be done inline 
    private static StringFormat s_format;   // more complex initialization needs code 

    static NeedsStaticConstructor() 
    { 
     s_stateTextFormat = new StringFormat(StringFormatFlags.NoWrap); 
     s_stateTextFormat.Alignment = StringAlignment.Near; 
     s_stateTextFormat.LineAlignment = StringAlignment.Far; 
    } 
} 
Cuestiones relacionadas