Diferença entre parâmetros REF e OUT em C#(CSharp)
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.
Links Relacionados
- Arquitetura CQRS
- Arrays em C#(CSharp)
- C#(CSharp) Converter inteiro para Hexadecimal e Hexadecimal para Inteiro
- C#(CSharp) Exemplo de Conversão de um List<> de uma classe qualquer para um DataTable.
- C#(CSharp) Função para verificar se um determinado número é Primo
- Calcular Idade C# (CSharp), diferença anos entre duas datas
- Classe com Métodos de extensão C# (CSharp)
- Classe para Ler e Gravar Cookies - Asp.Net MVC 4 com C# (CSharp)
- Classe para tratar valores nulos vindos de nossa Query SQL, C#(CSharp).
- Classes anônimas em C#(CSharp)
- Comando nameof() C#(CSharp)
- Compare duas strings ignorando maiúsculas e minúsculas C#(CSharp).
- Consulta SQLServer com paginação
- Criar Classes Dinâmicas usando DynamicObject e ExpandoObject em C# (CSharp)
- Definir o dia em um DateTime.
- DELETE CASCADE no SqlServer
- Desvendando o Poder da Função STRING_AGG no SQL Server para concatenação de dados
- Emitir sons pelo auto-falante do computador em C# (CSharp)
- Estrangulando um monólito C#(CSharp)
- Exemplo de acesso a dados com SQL Server em C#.
- Exemplo de consulta em SqlServer para encontrar uma chave Estrangeira
- Explorando Tipos de Dados Personalizados no SqlServer: Utilidade e Impacto na Performance
- Extensões para DataReader, tratando valores de suas consultas SQL (DataReaderExtensions) C#(CSharp)
- Formatar CEP em C# (CSharp)
- Função para devolver data do próximo dia da semana informado C#(CSharp).
- Gerando números randômicos para sorteio de jogos de azar C#(CSharp)
- Grafana Loki e .NET Framework com C#
- Incrementando e decrementando variáveis em C#(CSharp)
- Injeção de dependência
- Ler string de conexão (connectionStrings) do arquivo Web.config Asp.Net MVC co C#(CSharp)
- Métodos de extensão C#
- Ordenando um array com o comando OrderBy C#(CSharp)
- Parar um loop foreach usando o comando break C#(CSharp).
- Recuperar a URL da página anterior em Asp.Net C# (CSharp)
- Recuperar a URL da página atual em Asp.Net C# (CSharp)
- Recuperar para código C# (CSharp) o valor de um componente de nossa página
- Retorna o IP da conexão do Cliente em Asp.Net MVC com C# (CSharp)
- Retorna os dados do Navegador do Cliente em Asp.Net MVC com C# (CSharp)
- Salvando CSV com cabeçalho no SQL Server Management Studio
- Separar String de caracteres C#(CSharp)
- Serilog e .NET Framework com C#
- Tipos de dados em C# (CSharp)
- Tipos de dados primitivos em C#(CSharp)
- Validando Valores nulos vindos de nosso Banco de Dados C#(CSharp)
- Validar Modelos com Data Annotation e Windows Form Application C#(CSharp)
- Verificar se uma string é um digito em C# (CSharp)