.ctor es conocido por todos
.cctor no es familiar y puede ser fácilmente mal utilizado
El llamado .cctor es un constructor estático en sintaxis de C#
Con forma
Similitudes y diferencias entre .cctor y .ctor
1. No puedes tener identificadores de derechos de acceso públicos, privados, etc., que no puedan usarse, lo cual es diferente de .ctor
2. No debe haber valor de retorno, que es igual que .ctor
3. No puede haber parámetros, .ctor puede tener múltiples parámetros
4. Solo puede haber uno como mucho, y debe haber al menos un .ctor
5. El programador no puede controlar el tiempo de la llamada .cctor, en cierto sentido, puede controlar el tiempo de su llamada
6. Los programadores no pueden llamar directamente a .cctor, .ctor Cuando el programador utiliza el nuevo operador, .ctor será definitivamente llamado
Sincronización de la llamada .cctor:
El constructor estático se llama automáticamente antes de que se cree la primera instancia o se referencia cualquier miembro estático. (Esta es la cita original en MSDN)
Está claro que .cctor se llama solo una vez en el mismo dominio del programa, en lugar de llamarse cada vez que se instancia un objeto como .ctor
.cctor uso
Los constructores estáticos se utilizan para inicializar cualquier dato estático o para realizar operaciones específicas que solo necesitan realizarse una vez.
Por ejemplo:
Todo el siguiente código está compilado en Windows 7, frente al modo Release de 2005, y si los resultados son diferentes, considera cambiar al modo release y volver a intentarlo
Compila este segmento de código y luego usa ILDISM para verlo; la tabla de métodos es la siguiente
.ctor(): void // Este es un constructor de instancia de la clase proporcionada automáticamente por el compilador
Main():void(string[]) //Punto de entrada del programa
Obviamente, no hay .cctor en el ensamblador, y el compilador no proporcionará automáticamente funciones .cctor cuando una clase no tiene campos estáticos que necesiten ser inicializados, lo cual es diferente de .ctor, que siempre existe de todos modos
Modificar el código
Al compilar este código, aparecerá una advertencia, pero eso no es importante; lo importante es que al ver el ensamblador con ILDASTOM, el .cctor esperado, constructor estático, no aparezca.
¿¿Qué pasó?
¿Es errónea la inferencia? ¿CCTOR no es un campo estático usado para inicializar una clase?
Tranquilo, por favor, echa un vistazo al código
La única diferencia entre este código y el anterior es que cambia el valor inicial del campo estático i, y lo siguiente es presenciar el momento mágico
¡Vamos a DASM-lo y, para nuestra sorpresa, el tan solicitado .cctor por fin está aquí!
Mira el código de implementación de .cctor y verás:
.método privado hidebysig nombre especial rtspecialname static void .cctor() cil managed
{ Código tamaño 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Instanciar campos estáticos :-) IL_0001: stsfld int32 only_lonely. A::i IL_0006: ret } // fin del método A::.cctor
¿Por qué es así? La posible razón es que el valor por defecto del tipo Int32 es 0, y el compilador lo detecta y lo optimiza para que no produzca código .cctor
referencia
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Finalmente, podemos implementar nosotros mismos una función .cctor para implementar requisitos funcionales especiales
resumen 1、. CTOR es el método de construcción; 2、. cctor es un inicializador de tipos, que es un constructor estático en C#; 3. Cuando se instancia la clase C, primero asignará un valor al campo asignado en el momento de la declaración, luego llamará al constructor de la clase base, y después se construirá de la misma manera, hasta el sistema de nivel superior, y después volverá para ejecutar el código en el método explícito de construcción de C, que es un proceso recursivo de este tipo.
|