Passez un ref
si vous voulez changer ce qu'est 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 a string
. Vous ne pouvez pas modifier la valeur de a une string
fois qu'il a été créé. Mais en utilisant un ref
, vous pouvez créer une fonction qui change la chaîne pour une autre qui a une valeur différente.
Edit: Comme d'autres l'ont mentionné. Ce n'est pas une bonne idée d'utiliser à ref
moins que cela ne soit nécessaire. L'utilisation 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é.
En outre, 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 ref
mot clé est utilisé, vous avez une référence à une référence. Cela vous permet de faire les choses comme décrit dans l'exemple donné ci-dessus. Mais, lorsque le type de paramètre est une valeur primitive (par exemple int
), si ce paramètre est affecté à l'intérieur de la méthode, la valeur de l'argument transmis 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;
}