2011-04-29 9 views
7

Estoy escribiendo una pequeña aplicación de tejido IL utilizando Mono.Cecil, que requiere que manipule el conjunto de destino en un nivel IL.IL: ldfld vs ldflda

Mi pregunta es bastante simple, pero todavía encuentro el asunto muy confuso. ¿Cuál es la diferencia práctica entre las instrucciones ldfld y ldflda?

He consultado con msdn, y parece que mientras ldfld obtiene el valor del campo, ldflda obtiene la dirección del campo. Está bien ... pero ¿qué significa esto? Primero pensé que el primero se usa para los tipos de valor (y cadena), y el último para los tipos de referencia, pero he compilado un fragmento de C# y lo he comprobado en Reflector, y me ha demostrado que estaba equivocado.

no he podido encontrar ningún patrón distinto de cuando el compilador de C# ldflda emite en lugar de ldfld, y mis búsquedas no reveló ninguno de los artículos que explicarían esto. Entonces, ¿cuándo usar ldflda en lugar de ldfld?

Cualquier ayuda sería muy apreciada.

+0

Desde su descripción sospecho que utiliza ldflda si necesita pasar la variable a un parámetro ref, llamar a un método o asignarlo. – CodesInChaos

Respuesta

7

supongo que se utiliza para struct Ures:

struct Counter 
{ 
    public int i; 
} 

struct Something 
{ 
    public Counter c; 
} 

Something s; 
s.c.i++; 

Estoy bastante seguro de c aquí se carga por la dirección de lo contrario sería crear una copia de Counter. Es por eso que no puedes hacer esto con propiedad.

+2

+1 Estás en lo correcto. Ver también http://blogs.msdn.com/b/ericlippert/archive/2011/03/29/compound-assignment-part-one.aspx – SLaks

1

Si pasa un campo a una subrutina como un parámetro de referencia, debería ver el compilador emitirá un ldflda para ello con el fin de obtener la referencia a pasar.

Cuestiones relacionadas