c# il csc ildasm

¿Por qué se crea el.ctor() cuando compilo el código C#en IL?



csc ildasm (5)

Es el constructor predeterminado sin parámetros. Estás en lo correcto; no hace nada (además de pasar al constructor Object() base, que tampoco hace nada especial).

El compilador siempre crea un constructor predeterminado para una clase no estática si no hay otro constructor definido. Cualquier variable miembro se inicializa a los valores predeterminados. Esto es lo que puedes hacer.

new Hello();

sin toparse con errores.

Con este simple código C #, ejecuto csc hello.cs; ildasm /out=hello.txt hello.exe csc hello.cs; ildasm /out=hello.txt hello.exe .

class Hello { public static void Main() { System.Console.WriteLine("hi"); } }

Este es el código IL de ildasm.

.class private auto ansi beforefieldinit Hello extends [mscorlib]System.Object { .method public hidebysig static void Main() cil managed { .entrypoint // Code size 13 (0xd) .maxstack 8 IL_0000: nop IL_0001: ldstr "hi" IL_0006: call void [mscorlib]System.Console::WriteLine(string) IL_000b: nop IL_000c: ret } // end of method Hello::Main .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret } // end of method Hello::.ctor } // end of class Hello

¿Para qué .method public instance void .ctor() código .method public instance void .ctor() ? No parece hacer nada.


Esto se trata en la sección 10.11.4 de la especificación de lenguaje C #

Si una clase no contiene declaraciones de constructor de instancia, se proporciona automáticamente un constructor de instancia predeterminado. Ese constructor predeterminado simplemente invoca al constructor sin parámetros de la clase base directa

Aquí, Hello no tiene un constructor definido, por lo tanto, el compilador inserta el constructor predeterminado de no hacer nada que simplemente llama a la versión base / objeto


La clase Hello hereda el objeto, el constructor predeterminado generado simplemente llama al constructor del object de clase.


Me imagino que la especificación estipula que, dado que su clase en sí no es estática o abstracta, debe exponer un constructor sin parámetros predeterminado. De esta manera, otros usuarios de cualquier biblioteca o PE que construyas pueden crear una copia de tu clase.

Si no tuviera un .ctor, podría interpretarse como que tiene un .ctor privado, supongo. En general, es bastante vago. Pero lógicamente, tienes razón, no hay necesidad de .ctor en esta instancia.


Una clase para la que no define un constructor obtiene un constructor implícito público implícito.

public MyClass() :base() { }

Esto solo funciona si la clase base tiene un constructor sin parámetros accesible.