Podaj a, ref
jeś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 t
nie 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 string
raz 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, ref
chyba że jest to potrzebne. Użycie ref
daje 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 ref
sł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;
}