Passe a ref
se 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, t
nã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 string
depois 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 ref
menos que seja necessário. O uso ref
dá 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 ref
palavra-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;
}