Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 31028|Respuesta: 1

[Fuente] .ctor y .cctor de .net

[Copiar enlace]
Publicado en 6/4/2017 14:56:38 | | | |
.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.





Anterior:Objetos genéricos delimitados al contexto: ContextBoundObject ni las clases genéricas no son compatibles
Próximo:Resumen del orden de ejecución de métodos estáticos, no estáticos y constructivos en una clase
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com