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!

¿Fue útil?

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 
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top