Если у вас есть такой метод:
static void Increment(ref int value)
{
value = value + 1;
}
и назовите это так:
int value = 5;
Increment(ref value);
тогда получается, что вместо значения 5, помещаемого в стек, местоположение переменной value
помещается в стек. То есть содержимое value
изменяется непосредственно Increment
, а не после завершения метода.
Вот IL метода и вызова метода соответственно:
.method private hidebysig static void Increment(int32& 'value') cil managed
{
.maxstack 8
L_0000: nop
L_0001: ldarg.0
L_0002: ldarg.0
L_0003: ldind.i4 // loads the value at the location of 'value'
L_0004: ldc.i4.1
L_0005: add
L_0006: stind.i4 // stores the result at the location of 'value'
L_0007: ret
}
.method private hidebysig static void Main() cil managed
{
.entrypoint
.maxstack 9
.locals init ([0] int32 value) // <-- only one variable declared
L_0000: nop
L_0001: ldc.i4.5
L_0002: stloc.0
L_0003: ldloca.s 'value' // call Increment with the location of 'value'
L_0005: call void Program::Increment(int32&)
L_000a: ret
}