Quando desenvolvemos um método em C# que deve retornar um valor, colocamos na assinatura deste método o tipo de valor que este retorna, e no corpo do método, geralmente na última linha, a palavra reservada “return” e o valor a ser retornado. Porém, quando é necessário retornar mais de um valor usa-se parâmetros passados por referência. Há quem diga que a melhor solução neste caso é utilizar structs, e dependendo da quantidade de retornos, concordo. É uma boa prática.
Ao passar parâmetros por referência, estamos passando uma referência ao endereço de memória da variável para a função. Desta forma, quando a função altera o valor do parâmetro passado, está alterando o valor da variável passado na chamada do método, ao contrário da passagem por valor, que não altera o valor original da variável.
Em C#, na passagem de parâmetros por referência podemos fazê-lo de duas formas: por “out” ou por “ref”. Um parâmetro “out” é apenas um parâmetro de saída, ou seja, o método recebe a referência da varável passada, porém não recebe o valor. Desta forma, é possível setar o valor do parâmetro, mas o método chamador não conseguirá ler o valor do parâmetro. Veja um exemplo:
static void Main()
{
int numero;
funcao(out numero);
Console.WriteLine("Valor na Main = " + numero);
Console. ReadLine();
}
private static void funcao(out int parametro)
{
parametro = 1;
}
A saída na tela será o valor “1”, para ambos os métodos. Repare que sequer inicializei a variável “numero”. Para passar um parâmetro por “out”, não é necessário inicializa-lo, pelo fato deste tipo de parâmetro não ser um parâmetro de entrada. Se eu setasse um valor para a variável parâmetro, passasse para o método como “out”, e tentasse ler o valor deste parâmetro, daria erro de variável não inicializada.
Por outro lado, os parâmetros passados com o modificador “ref” são parâmetros de entrada e saída. Ao passar uma variável “ref” como parâmetro para um método, este poderá ler o valor deste parâmetro, e modifica-lo. Neste caso é necessário inicializar a variável antes de passa-la na chamada de uma função. Veja como fica:
static void Main()
{
int numero = 1;
funcao(ref numero);
Console.WriteLine("Valor = " + numero);
Console.ReadLine();
}
private static void funcao(ref int parametro)
{
parametro++;
}
Neste exemplo inicializamos a variável “numero” com o valor “1”. Ao passar a variável como parâmetro “ref” para a função, incrementando o parâmetro no corpo do método, o valor de “numero” também é incrementado.
Só pra lembrar: se não utilizar nenhum modificador (ref ou out) a variável será passada como parâmetro por valor, o que não altera o valor original da variável. No nosso exemplo, se a passagem de parâmetros fosse por valor, o valor de “numero” não seria alterado.
3 comentários:
Você poderia postar uma foto da nova camisa do Grêmio. Ia bombar o blog, hehe.
Thanks, ajudou bastante
Que bom. Fico feliz em ajudar.
Obrigado pelo feedback.
Abraço
Postar um comentário