colocador .NET IL Propiedad
-
10-10-2019 - |
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
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.