PASSAGEM DE PARAMETROS EM C#



PASSAGEM DE PARAMETROS EM C#

  Existem 3 tipos de passagem de parametros:

• Entrada (por valor)
• Entrada/Saída (por referência - ByRef / ref)
• Saída (out)

  O conhecimento popular que quando um argumento é passado por valor, as alterações feitas pela função chamada não são refletidas no chamador e que quando um argumento é passado por referência, a memória é alocada pelo chamador e a função chamada pode alterar o valor passado. Adiciona-se, ainda, o fato de que ao se passar parametros de saí­da (out), a memória é alocada e o valor é atribuido pela própria função de forma que este é retornado ao originador da chamada.

  public void FazerCalculos(int x, ref int y, out int z){
  x = 7; //não é refletido na origem
  y = 7; /é refletido na origem
  z = 7; //inicialização obrigatória - out.
  }
  
  public void FazerCalculos(object x, ref object y, out object z){
  x = new object();     //não refletido na origem
  y = new object();     //refletido na origem. Origem agora
        // possui uma referencia
        // a outro objeto.
        // não é o mesmo que foi passado.
  z = new object();     //inicialização obrigatória.
  }

  Legal, todos nós já estudamos isto na escola, mas gostaria de levantar um detalhe importante: algumas vezes os desenvolvedores assumem INCORRETAMENTE que se passarmos um objeto por valor para uma função, esta não pode alterar os atributos daquele objeto. Não é o caso, observe o exemplo a seguir:
 

using System;

namespace FunctionParameters{
 
 class EntryPoint{  
  [STAThread]
  static void Main(){
  pessoa p = new pessoa();
  UmaClasseQualquer.AlteraIdade(p);
  Console.WriteLine(p.idade.ToString()); // exibe 29
  }
 }

 class pessoa{
  public int idade = 18;
 }

 class UmaClasseQualquer{
  public static void AlteraIdade(pessoa p1){
  p1.idade=29;
  } 
 }
}


 
  No caso acima p1 é passado por valor e a função altera o campo idade de forma que o chamador perceberá esta alteração. Logo os atributos/campos de um objeto podem sim ser alterados e isto independende da declaração dos parametros.

No caso de passarmos objetos como parâmetros, a passagem por valor indica simplesmente que se a função atribuir a variável passada a um outro objeto, o chamador mantem a referencia inicial. Se a passagem for por referencia e a função atribui a variável a outro objeto, o chamador recebe esta nova referencia quando do retorno da função.

Parametros de saída são parametros referenciados marcados com um atributo especial afim de simplificar a passagem por remoting. De fato quando o chamador e o objeto vivem em máquinas diferentes, quanto menos dados forem transmitidos pela rede a cada chamada, melhor.

Parametros passados por valor não precisam ser trasmitidos de volta, mas os parametros passados por referencia, são enviados duas vezes: do chamador para o objeto remoto e vice-versa.

Parametros de saí­da são enviados somente do objeto remoto para o chamador pois são inicializados remotamente.

Temos este tipo de parametro também no VB.NET, basta usarmos o seguinte atributo na passagem por referencia:

Imports System.Runtime.InteropServices
…
Sub UsandoOutNoVb( ByRef x as Integer)
…
End Sub




 
Existem outros pontos interessantes sobre a passagem de parametros. Comentaremos mais em outra oportunidade. 

Autor: ADILSON BENEVIDES SOBRAL


Artigos Relacionados


Embaixo Do Calçadão...

Theo De Carvalho - Segundo AniversÁrio

Divagando

O Processo Da Independência Do Brasil

IncÓgnita

Quando Vier Me Visitar...

País De Duas Faces