Podaj a, refjeśli chcesz zmienić obiekt:
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";
}
Po wywołaniu DoSomething tnie odnosi się do oryginału new TestRef, ale odnosi się do zupełnie innego obiektu.
Może to być również przydatne, jeśli chcesz zmienić wartość niezmiennego obiektu, np string. Nie można zmienić wartości stringraz utworzonej. Ale używając a ref, możesz utworzyć funkcję, która zmienia łańcuch na inną, która ma inną wartość.
Edycja: jak wspomnieli inni ludzie. Nie jest dobrym pomysłem używanie, refchyba że jest to potrzebne. Użycie refdaje tej metodzie swobodę zmiany argumentu na coś innego, wywołujące metodę będą musiały zostać zakodowane, aby upewnić się, że poradzą sobie z tą możliwością.
Ponadto, gdy typ parametru jest obiektem, wówczas zmienne obiektu zawsze działają jako odniesienia do obiektu. Oznacza to, że po użyciu refsłowa kluczowego masz odniesienie do odwołania. Umożliwia to wykonywanie czynności opisanych w powyższym przykładzie. Ale jeśli typ parametru jest pierwotną wartością (np. int), To jeśli parametr ten jest przypisany do metody, wartość przekazanego argumentu zostanie zmieniona po zwróceniu metody:
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;
}