sexta-feira, 17 de setembro de 2010

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.

Fonte: http://www.webartigos.com/articles/20200/1/PASSAGEM-DE-PARAMETROS-EM-C/pagina1.html#ixzz0zoPyADyL

Nenhum comentário:

Postar um comentário