¿Cómo se accedería a las propiedades del objeto en CIL (MSIL)?
-
19-08-2019 - |
Pregunta
Soy un principiante absoluto, ya ves. Digamos que tengo un objeto de cadena en la pila y quiero obtener la cantidad de caracteres que contiene: su propiedad .Length. ¿Cómo podría obtener el número int32 oculto dentro?
¡Muchas gracias de antemano!
Solución
Realmente no existen las propiedades en IL. Solo hay campos y métodos. El constructor traduce la construcción de la propiedad C # a los métodos get_PropertyName
y set_PropertyName
, por lo que debe llamar a estos métodos para acceder a la propiedad.
IL de muestra (depuración) para el código
var s = "hello world";
var i = s.Length;
IL
.locals init ([0] string s,
[1] int32 i)
IL_0000: nop
IL_0001: ldstr "hello world"
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: callvirt instance int32 [mscorlib]System.String::get_Length()
IL_000d: stloc.1
Como puede ver, se accede a la propiedad Longitud a través de la llamada a get_Length
.
Otros consejos
Hice trampa ... Tomé el siguiente código C # y lo miré en ildasm / Reflector
static void Main(string[] args)
{
string h = "hello world";
int i = h.Length;
}
es equivalente a
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] string h,
[1] int32 i)
L_0000: nop
L_0001: ldstr "hello world"
L_0006: stloc.0
L_0007: ldloc.0
L_0008: callvirt instance int32 [mscorlib]System.String::get_Length()
L_000d: stloc.1
L_000e: ret
}