Passe a refse você deseja alterar qual é o objeto:
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";
}
Depois de chamar DoSomething, tnão se refere ao original new TestRef, mas se refere a um objeto completamente diferente.
Isso também pode ser útil se você quiser alterar o valor de um objeto imutável, por exemplo, a string. Você não pode alterar o valor de uma stringdepois que ele foi criado. Mas, usando a ref, você pode criar uma função que altera a string para outra que tenha um valor diferente.
Edit: Como outras pessoas mencionaram. Não é uma boa ideia usar a refmenos que seja necessário. O uso refdá ao método a liberdade de alterar o argumento para outra coisa, os chamadores do método precisarão ser codificados para garantir que eles manejem essa possibilidade.
Além disso, quando o tipo de parâmetro é um objeto, as variáveis de objeto sempre atuam como referências ao objeto. Isso significa que, quando a refpalavra-chave é usada, você tem uma referência a uma referência. Isso permite que você faça as coisas conforme descrito no exemplo acima. Mas, quando o tipo de parâmetro é um valor primitivo (por exemplo int), se esse parâmetro for atribuído ao método, o valor do argumento que foi passado será alterado após o retorno do método:
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;
}