Pregunta IL: ldfld vs ldflda


Estoy escribiendo una pequeña aplicación de tejido IL utilizando Mono.Cecil, que me obliga a manipular el conjunto de destino en un nivel IL.

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

He consultado con msdn, y parece que mientras ldfld recupera 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 distintivo cuando el compilador de C # emite ldflda en lugar de ldfld, y mis búsquedas no revelaron ningún artículo que pudiera explicar esto. Entonces cuando usar ldflda en lugar de ldfld?

Cualquier ayuda sería muy apreciada.


7
2018-04-29 18:16


origen


Respuestas:


Supongo que se usa para structures:

struct Counter
{
   public int i;
}

struct Something
{
   public Counter c;
}

Something s;
s.c.i++;

estoy bastante seguro c aquí está cargado por dirección de lo contrario, crearía una copia de Counter. Es por eso que no puedes hacer esto con propiedad.


7
2018-04-29 18:20



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


1
2018-04-29 18:21