Par défaut (en C#), le passage d'un objet à une fonction transmet une copie de la référence à cet objet. La modification du paramètre lui-même ne modifie que la valeur du paramètre et non la variable spécifiée.
void Test1(string param)
{
param = "new value";
}
string s1 = "initial value";
Test1(s1);
// s1 == "initial value"
Utilisation out
ou ref
passe une référence à la variable spécifiée dans l'appel à la fonction. Toute modification de la valeur d'un paramètre out
ou ref
sera renvoyée à l'appelant.
Les deux out
et ref
comportent de manière identique, sauf pour une légère différence: ref
paramètres doivent être initialisées avant d'appeler, alors que out
paramètres peuvent être uninitialised. Par extension, les paramètres ref
sont garantis être initialisés au début de la méthode, tandis que les paramètres out
sont traités comme non initialisés.
void Test2(ref string param)
{
param = "new value";
}
void Test3(out string param)
{
// Use of param here will not compile
param = "another value";
}
string s2 = "initial value";
string s3;
Test2(ref s2);
// s2 == "new value"
// Test2(ref s3); // Passing ref s3 will not compile
Test3(out s2);
// s2 == "another value"
Test3(out s3);
// s3 == "another value"
Modifier: Comme dp rappelle, la différence entre out
et ref
n'est appliquée par le compilateur C#, non par le CLR. Pour autant que je sache, VB n'a pas d'équivalent pour out
et implémente ref
(comme ByRef
) uniquement, correspondant au support du CLR.
"copie de la référence à cet objet" ou "référence à la copie de cet objet"? – bjan