PASSAGEM DE PARAMETROS EM C#
Por ADILSON BENEVIDES SOBRAL | 23/06/2009 | TecnologiaPASSAGEM 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(
â?¦
End Sub
Existem outros pontos interessantes sobre a passagem de parametros. Comentaremos mais em outra oportunidade.