Como seria um propriedades de acesso a objetos em CIL (MSIL)?
-
19-08-2019 - |
Pergunta
Eu sou um novato absoluto, você vê. Digamos que eu tenha um objeto string na pilha e deseja obter o número de caracteres no - sua .Length propriedade. Como eu poderia obter o número int32 dentro escondido?
Muito obrigado antecipadamente!
Solução
Não há realmente nenhuma coisa como propriedades em IL. Existem apenas campos e métodos. A construção propriedade C # é traduzido para get_PropertyName
e set_PropertyName
métodos pelo compilador, então você tem que chamar esses métodos para acessar a propriedade.
Amostra (debug) IL para 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 você pode ver a propriedade Length é acessado via a chamada para get_Length
.
Outras dicas
Eu enganei ... Peguei o seguinte código C # e deu uma olhada em ildasm / Refletor
static void Main(string[] args)
{
string h = "hello world";
int i = h.Length;
}
é 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
}