Passez un ref
si vous voulez changer l'objet :
TestRef t = new TestRef();
t.Something = "Foo";
DoSomething(ref t);
void DoSomething(ref TestRef t)
{
t = new TestRef();
t.Something = "Not just a changed t, but a completely different TestRef object";
}
Après avoir appelé DoSomething, t
ne fait pas référence à l'original new TestRef
mais fait référence à un objet complètement différent.
Cela peut également être utile si vous souhaitez modifier la valeur d'un objet immuable, par exemple une string
. Vous ne pouvez pas modifier la valeur d'un string
une fois qu'il a été créé. Mais en utilisant un ref
vous pouvez créer une fonction qui remplace la chaîne par une autre dont la valeur est différente.
Ce n'est pas une bonne idée d'utiliser ref
à moins que cela ne soit nécessaire. Utilisation de ref
donne à la méthode la liberté de changer l'argument pour autre chose, les appelants de la méthode devront être codés pour s'assurer qu'ils gèrent cette possibilité.
De même, lorsque le type de paramètre est un objet, les variables d'objet agissent toujours comme des références à l'objet. Cela signifie que lorsque le paramètre ref
est utilisé, vous avez une référence à une référence. Cela vous permet de faire des choses comme celles décrites dans l'exemple donné ci-dessus. Mais, lorsque le type de paramètre est une valeur primitive (par ex. int
), alors si ce paramètre est affecté à l'intérieur de la méthode, la valeur de l'argument qui a été passé sera modifiée après le retour de la méthode :
int x = 1;
Change(ref x);
Debug.Assert(x == 5);
WillNotChange(x);
Debug.Assert(x == 5); // Note: x doesn't become 10
void Change(ref int x)
{
x = 5;
}
void WillNotChange(int x)
{
x = 10;
}