;

quarta-feira, 9 de fevereiro de 2011

Passagem de parâmetros por referência: out e ref

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:

Anônimo disse...

Você poderia postar uma foto da nova camisa do Grêmio. Ia bombar o blog, hehe.

Anônimo disse...

Thanks, ajudou bastante

Gabriel Bauermann disse...

Que bom. Fico feliz em ajudar.
Obrigado pelo feedback.
Abraço

Postar um comentário