Diferença entre parâmetros REF e OUT em C#(CSharp)

Autor : Antonio Carlos Ferreira de Azevedo
Postado em : 11/12/2018


As palavras-chave ref e out são usadas para passar argumento / parâmetro para um método ou função. Indica que um argumento / parâmetro é passado por referência.

Palavra-chave ref

A palavra-chave ref transmite argumentos como referência. Na pratica isso significa que quaisquer alterações feitas nesse argumento no método serão refletidas nessa variável quando o controle retornar ao método de chamada.

Exemplo de Código

public static string getProximoNome(ref int id)
{
    string TextoRetorno = "Proximo - " + id.ToString();
    id += 1;
    return TextoRetorno;
}

static void Main(string[] args)
{
    int i = 1;
    Console.WriteLine("Proximo valor para inteiro i:" + i.ToString());
    string test = getProximoNome(ref i);
    Console.WriteLine("Valor atual para interiro i:" + i.ToString());
}

Resultado

Proximo valor para inteiro 1:1
Valor atual para inteiro i:2


Palavra-chave out

É muito parecido com o parâmetro ref, transmite argumentos por referência.

Exemplo de Código

public static string getProximoNomeByOut(out int id)
{
    id = 1;
    string TextoRetorno = "Proximo - " + id.ToString();
    return TextoRetorno;
}
static void Main(string[] args)
{
    int i = 0;
    Console.WriteLine("Proximo valor para inteiro i:" + i.ToString());
    string test = getProximoNomeByOut(out i);
    Console.WriteLine("Valor atual para inteiro i:" + i.ToString());
}

Resultado

Proximo valor para inteiro 1:0
Valor atual para inteiro i:1


ref x out

ref out
O parâmetro ou argumento deve ser inicializado antes de ser passado para ref. Não é obrigatório inicializar um parâmetro ou argumento antes de ser passado para uma out.
Quando em seu método não é necessário atribuir ou inicializar o valor de um parâmetro, antes de retornar ao método de chamada. Quando em seu método é necessário atribuir ou inicializar um valor de um parâmetro antes de retornar ao método de chamada.
Passar um valor de parâmetro por ref é útil quando é necessário modificar o parâmetro de passagem. Declarar um parâmetro para um método out é útil quando precisamos retornar vários valores de uma função ou método.
Quando usamos ref, os dados podem ser passados bidirecionalmente. Quando usamos os dados out só é passado de maneira unidirecional (do método chamado para o método chamador).
Ambos ref e out são tratados de forma diferente em tempo de execução e são tratados da mesma forma em tempo de compilação.
Propriedades não variáveis não podem ser passadas como parâmetro para out ou ref.


Sobrecarga de métodos

Não é possível fazer a sobrecarga de métodos, ambos ref e out são tratados de maneira diferentes em tempo de execução e tratados da mesma forma em tempo de compilação.

Exemplo Código

public static string getProximoNome(ref int id)
{
    string TextoRetorno = "Proximo - " + id.ToString();
    id += 1;
    return TextoRetorno;
}

public static string getProximoNomeByOut(out int id)
{
    id = 1;
    string TextoRetorno = "Proximo - " + id.ToString();
    return TextoRetorno;
}

Você vai receber a seguinte mensagem caso tente sobrecarregar os métodos como ref e out ao mesmo tempo.

Cannot define overloaded method ´getProximoNome´ because it differs from another method only on ref and out


Conclusão

As palavras-chave out e ref são úteis quando queremos retornar um valor nas mesmas variáveis que são passadas como um argumento.





Comentários