DotNet – Porque usar o “ref” para “ReferenceTypes” ?
Esses dias eu estava conversando com um amigo sobre a necessidade de usar “ref” para passar por referência objetos “ReferenceType” [LINK]. Ele me dizia que não era necessário, e eu dizia que mesmo que não fosse necessário, o ideal era utilizar para aumentar a legibilidade.
Hoje conversando sobre isso na empresa o @tomamais me enviou essa pagina do MSDN [LINK] onde os exemplos 4 e 5 respondem a dúvida.
A RESPOSTA:
Um parâmetro do tipo “reference type” será tratado como passagem por referencia mesmo que não use a palavra reservada “ref”, porem se essa variável for “reinstanciada”, as modificações posteriores não vão refletir fora do método.
class Program
{
static void Change(int[] arr)
{
arr[0] = 888; // Essa mudança afeta o elemento original.
arr = new int[5] { -3, -1, -2, -3, -4 }; // Essa mudança é local.
Console.WriteLine("Dentro do metodo, o primeiro valor é: {0}", arr[0]);
}
public static void Main()
{
int[] myArray = { 1, 4, 5 }; /// Array de 3 posições
Console.WriteLine("Na Main, antes da chamada do metodo, o primeiro valor é: {0}", myArray[0]);
Change(myArray);
Console.WriteLine("Na Main, depois da chamada do metoro, o primeiro valor é: {0}", myArray[0]);
Console.Read();
}
}
Saída no console:
Na Main, antes da chamada do metodo, o primeiro valor é: 1
Dentro do metodo, o primeiro valor é: -3
Na Main, depois da chamada do metoro, o primeiro valor é: 888
É por esse motivo que precisamos usar o “ref”.
Repare que com o uso da palavra reservada, o valor é alterado mesmo reinstanciando a variável.
class Program
{
static void Change(ref int[] arr)
{
arr[0] = 888; // Essa mudança afeta o elemento original.
arr = new int[5] { -3, -1, -2, -3, -4 }; // Essa mudança é global.
Console.WriteLine("Dentro do metodo, o primeiro valor é: {0}", arr[0]);
}
public static void Main()
{
int[] myArray = { 1, 4, 5 }; /// Array de 3 posições
Console.WriteLine("Na Main, antes da chamada do metodo, o primeiro valor é: {0}", myArray[0]);
Change(ref myArray);
Console.WriteLine("Na Main, depois da chamada do metoro, o primeiro valor é: {0}", myArray[0]);
Console.Read();
}
}Saída no console:
Na Main, antes da chamada do metodo, o primeiro valor é: 1
Dentro do metodo, o primeiro valor é: -3
Na Main, depois da chamada do metoro, o primeiro valor é: -3
CONCLUSÃO:
O uso da palavra reservada “ref” é obrigatório não somente pela legibilidade do código, mas também quando acontece a reinstanciação de uma variável. Quando reinstanciamos a variável dentro método no contexto global, o valor será diferente do desejado.

