ref (référence C#)
Le mot clé ref fait en sorte que les arguments soient passés par référence. La conséquence est que toute modification apportée au paramètre dans la méthode est reflétée dans cette variable lorsque la méthode appelante récupère le contrôle.
Notes
Ne confondez pas le concept du passage par référence avec le concept de types référence. Les deux concepts ne sont pas identiques. Un paramètre de méthode peut être modifié par ref, même s'il s'agit d'un type de valeur ou d'un type de référence. Par conséquent, il n'y a aucun boxing d'un type valeur lorsqu'il est passé par référence.
Pour utiliser un paramètre ref, la définition de méthode et la méthode d'appel doivent toutes deux utiliser le mot clé ref explicitement. Par exemple :
class RefExample
{
static void Method(ref int i)
{
// Rest the mouse pointer over i to verify that it is an int.
// The following statement would cause a compiler error if i
// were boxed as an object.
i = i + 44;
}
static void Main()
{
int val = 1;
Method(ref val);
Console.WriteLine(val);
// Output: 45
}
}
Un argument passé à un paramètre ref doit être initialisé en premier lieu. Cela est différent de out, dont les arguments n'ont pas besoin d'être initialisés explicitement avant d'être passés. Pour plus d'informations, consultez out.
Bien que les mots clés ref et out entraînent des comportements différents au moment de l'exécution, ils ne sont pas considérés comme faisant partie de la signature de méthode au moment de la compilation. Par conséquent, les méthodes ne peuvent pas être surchargées si une méthode prend un argument ref et que l'autre prend un argument out. Par conséquent, l'exemple de code suivant ne procèdera pas à la compilation :
class CS0663_Example
{
// Compiler error CS0663: "Cannot define overloaded
// methods that differ only on ref and out".
public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
}
Toutefois, la surcharge peut survenir si une méthode prend un argument ref ou out et si l'autre n'utilise ni l'un ni l'autre, comme dans l'exemple suivant :
class RefOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}
Les propriétés ne sont pas des variables. Elles sont réellement des méthodes, et de ce fait ne peuvent pas être passées comme paramètres ref.
Pour plus d'informations sur le passage de tableaux, consultez Passage de tableaux à l'aide de paramètres ref et out (guide de programmation C#).
Exemple
Le fait de passer les types valeur par référence (comme indiqué plus haut dans cette rubrique) est utile, mais ref est également utile pour passer des types référence. Cela permet aux méthodes appelées de modifier l'objet auquel la référence fait référence, car la référence elle-même est passée par référence. L'exemple suivant illustre que lorsqu'un type référence est passé en tant que paramètre ref, l'objet lui-même peut être modifié. Pour plus d'informations, consultez Passage de paramètres de type référence (Guide de programmation C#).
class RefExample2
{
static void Method(ref string s)
{
s = "changed";
}
static void Main()
{
string str = "original";
Method(ref str);
Console.WriteLine(str);
}
}
// Output: changed
Spécification du langage C#
Pour plus d'informations, consultez la Spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.
Voir aussi
Référence
Passage de paramètres (Guide de programmation C#)
Paramètres de méthode (référence C#)