Il dépend de la compilation contexte (Voir Exemple ci-dessous).
out
et ref
à la fois désigner la variable passage par référence, pourtant, ref
implique que la variable est initialisée avant d'être votée, ce qui peut être une différence importante dans le contexte de Regroupement (Interop: UmanagedToManagedTransition ou vice versa)
MSDN avertit:
Do not confuse the concept of passing by reference with the concept of reference types. The two concepts are not the same. A method parameter can be modified by ref regardless of whether it is a value type or a reference type. There is no boxing of a value type when it is passed by reference.
De la officiel MSDN Docs:
The out keyword causes arguments to be passed by reference. This is similar to the ref keyword, except that ref requires that the variable be initialized before being passed
The ref keyword causes an argument to be passed by reference, not by value. The effect of passing by reference is that any change to the parameter in the method is reflected in the underlying argument variable in the calling method. The value of a reference parameter is always the same as the value of the underlying argument variable.
On peut vérifier que les ref sont en effet les mêmes lorsque l'argument est affectée:
CIL Exemple:
Considérons l'exemple suivant
static class outRefTest{
public static int myfunc(int x){x=0; return x; }
public static void myfuncOut(out int x){x=0;}
public static void myfuncRef(ref int x){x=0;}
public static void myfuncRefEmpty(ref int x){}
// Define other methods and classes here
}
dans CIL, les instructions d' myfuncOut
et myfuncRef
sont identiques comme prévu.
outRefTest.myfunc:
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: starg.s 00
IL_0004: ldarg.0
IL_0005: stloc.0
IL_0006: br.s IL_0008
IL_0008: ldloc.0
IL_0009: ret
outRefTest.myfuncOut:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldc.i4.0
IL_0003: stind.i4
IL_0004: ret
outRefTest.myfuncRef:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldc.i4.0
IL_0003: stind.i4
IL_0004: ret
outRefTest.myfuncRefEmpty:
IL_0000: nop
IL_0001: ret
nop: aucune opération, ldloc: la charge locale, stloc: pile locale, ldarg: charge argument, bs.s: direction de la cible....
(Voir: Liste des CIL instructions )