Pregunta

Considere esta clase:

public class Foo
{
    // Fields
    private string _bar;

    // Properties
    private string Bar
    {
        get
        {
            return this._bar;
        }
        set
        {
            this._bar = value;
        }
    }
}

Ahora, cuando voy y la mirada en el código IL emitida por el compilador para la incubadora de la propiedad Bar:

.method private hidebysig specialname instance void set_Bar(string 'value') cil managed
{
    .maxstack 8
    L_0000: nop 
    L_0001: ldarg.0 
    L_0002: ldarg.1 
    L_0003: stfld string ConsoleApplication2.Program/Foo::_bar
    L_0008: ret 
}

¿por qué hacer un ldarg.0? ¿QUÉ está situado en primera (índice 0) argumento? Dado que el método setter / propiedad sólo tiene 1 argumento ...

Lo mismo va para el comprador:

.method private hidebysig specialname instance string get_Bar() cil managed
{
    .maxstack 1
    .locals init (
        [0] string CS$1$0000)
    L_0000: nop 
    L_0001: ldarg.0 
    L_0002: ldfld string ConsoleApplication2.Program/Foo::_bar
    L_0007: stloc.0 
    L_0008: br.s L_000a
    L_000a: ldloc.0 
    L_000b: ret 
}

¿Por qué la .locals init? ¿Por qué la ldarg.0? ¿Por qué no hacer un ldfld del campo respaldo y simplemente regresa esa? :)

Gracias.

-Snake

¿Fue útil?

Solución

Para el organismo:

Cualquier miembro de instancia tiene un implícito "este" parámetro - eso es lo que está siendo cargado, básicamente. Intenta convertirla en una propiedad estática y verá que desaparezca.

Para el comprador, no estoy seguro de por qué existe la variable local ... apoyo depurador, tal vez? Desde luego compilarlo en modo optimizado (/o+ /debug- desde la línea de comandos) se deshace de la variable local.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top