Encontré la característica de "parámetros opcionales" en C# 4.0 muy interesante, así que traté de averiguar cómo lo hicieron posible. así que escribió un método como este:¿Qué significa [opt] en MSIL?
private static void A(int a = 5) { }
recopiló, a continuación, decompilados en IL DASM, este es el código IL:
.method private hidebysig static void A([opt] int32 a) cil managed
{
.param [1] = int32(0x00000005)
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Program::A
Y se ha conseguido esto en sus metadatos:
(1) ParamToken: (08000002) Nombre: un banderas: [Opcional] [HasDefault] (00001010) por defecto: (I4) 5
Así que siguió a la idea y escribió un método como este:
private static void B([Optional, DefaultParameterValue(78)]int b) { }
compilado y decompiled ella, y encontró que el compilador de C# genera casi el código MSIL idénticos para el método A y B (excepto para el nombre).
Como podemos ver, no hay ninguna señal de atributos en el código IL y se sentía mal, por lo que escribió un atributo personalizado como esto:
[AttributeUsage(AttributeTargets.Parameter)]
public class MyTestAttribute : Attribute
{
}
Luego lo usó en el método C de esta manera:
private static void C([MyTest]int c) { }
compilado y luego descompilado, y hah, he encontrado este:
.method private hidebysig static void C(int32 c) cil managed
{
.param [1]
.custom instance void ConsoleApplication1.MyTestAttribute::.ctor() = (01 00 00 00)
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Program::C
la segunda línea de la El método llama al ctor de mi atributo personalizado.
Así que esto conduce a mis dudas:
- Lo que sí [opt] significa? Me refiero al que aparece delante del parámetro del método A y B.
- ¿Cómo es que el método C llama al constructor del atributo que se aplica a su parámetro y el método A y B no?
- Parece que no puedo encontrar ningún signo de DefaultParameterValueAttribute en los metadatos, pero puedo encontrar OptionalAttribute y MyTestAttribute. ¿Porqué es eso? ¿Hay algo que me falta?
Gracias de antemano.
Gracias, no esperaba obtener una respuesta tan pronto. Pero el tuyo parece ser el indicado. – CuiPengFei
Y he estado pensando que opt significa optimizado ... – CuiPengFei
Wow, no esperaba encontrar un error de CSC. – CuiPengFei