quarta-feira, 29 de abril de 2009

C# - Métodos: Passando parâmetros por valor ou por referência

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2009/04/29/C-Metodos-Passando-parametros-por-valor-ou-por-referencia.aspx

Duas maneiras de passar parâmetros para um método são por valor ou por referência.

Quando um parâmetro é passado por valor, uma cópia dele é feita e passada para o método. Mudanças realizadas dentro do método não afetam o valor onde o método foi chamado.

Quando um parâmetro é passado por referência, é passada para o método a abilidade para acessar e modificar a variável original, passada quando o método foi chamado.

Para passar um parâmetro por referência, utiliza-se uma das seguintes palavras-chave: ref ou out. A palavra-chave ref é utilizada para variáveis já inicializadas. Quando a palavra-chave out é utilizada, é possível passar como parâmetro variáveis que ainda não foram inicializadas, podendo fazer com que elas sejam inicializadas dentro do método.


Exemplo:

   1:  class Quadrado

   2:  {

   3:      public void QuadradoValor(int num)

   4:      {

   5:          num = num * num;

   6:      }

   7:   

   8:      public void QuadradoOut(out int num)

   9:      {

  10:          num = 10;

  11:          num = num * num;

  12:      }

  13:   

  14:      public void QuadradoRef(ref int num)

  15:      {

  16:          num = num * num;

  17:      }

  18:  }



Implementação do exemplo:

   1:  class Program

   2:  {

   3:      static void Main(string[] args)

   4:      {

   5:          int a;

   6:          int b = 100;

   7:          Quadrado quadrado = new Quadrado();

   8:   

   9:   

  10:          Console.WriteLine("Valores iniciais das variáveis");

  11:          Console.WriteLine("Valor atual de [a]: 'não inicializado'");

  12:          Console.WriteLine("Valor atual de [b]: " + b.ToString() + "\n");

  13:   

  14:   

  15:          quadrado.QuadradoOut(out a);

  16:          quadrado.QuadradoRef(ref b);

  17:   

  18:          Console.WriteLine("Passando os parâmetros por referência:");

  19:          Console.WriteLine("[a] com Out: " + a.ToString());

  20:          Console.WriteLine("[b] com Ref: " + b.ToString() + "\n");

  21:   

  22:   

  23:          quadrado.QuadradoValor(a);

  24:          quadrado.QuadradoValor(b);

  25:   

  26:          Console.WriteLine("Passando os parâmetros por valor:");

  27:          Console.WriteLine("[a]: " + a.ToString());

  28:          Console.WriteLine("[b]: " + b.ToString());

  29:   

  30:   

  31:          Console.ReadLine();

  32:      }

  33:  }

Nenhum comentário: