Home Artigos Eventos Forum Oportunidades Fotos Blogs Downloads
 
        Home
        Artigos
        Eventos
        Forum
        Oportunidades
        Fotos
        Blogs
        Downloads
Login
Registre-se



 
 

Descontão Raptors na loja da O'Reilly


Passagem de Parâmetros

Enviado por  em Monday, September 13, 2004 (ESAST)

Algumas vezes os desenvolvedores assumem incorretamente o comportamento da passagem de parâmetros. Vejamos....

Miguel Ferreira
miguel.ferreira@dotnetraptors.com.br
www.southern.com.br




  Existem 3 tipos de passagem de parâmetros:

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

  É 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 parâmetros de saída (out), a memória é alocada e o valor é atribuído 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 referência
// 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 parâmetros.

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 referência inicial. Se a passagem for por referência e a função atribui a variável a outro objeto, o chamador recebe esta nova referência quando do retorno da função.

Parâmetros de saída são parâmetros 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.

Parâmetros passados por valor não precisam ser trasmitidos de volta, mas os parâmetros passados por referência, são enviados duas vezes: do chamador para o objeto remoto e vice-versa.

Parâmetros de saída são enviados somente do objeto remoto para o chamador pois são inicializados remotamente.

Temos este tipo de parâmetro também no VB.NET, basta usarmos o seguinte atributo na passagem por referência:

Imports System.Runtime.InteropServices

Sub UsandoOutNoVb(<Out()> ByRef x as Integer)

End Sub

 
Existem outros pontos interessantes sobre a passagem de parâmetros. Comentaremos mais em outra oportunidade. 

 


Comments:

Qual usar ?
By HELLFROST on Tuesday, January 18, 2005 (ESAST)

De todos os exemplos sobre passagem de Parâmetro este foi o mais explicado e melhor, e para eu continuar meus estudos, so uma opinião de quem ja tem muita experiência.

 

Sou iniciante em ASP.net e queria saber para meu caso, qual devo usar para passagem de Parâmetro. Estou tentando fazer o seguinte, todo o site tem sua área de manutenção, onde no ADM vamos la pra INSERIR, DELETAR e ALTERAR, se eu clicar para Alterar ou Deletar um registro, tenho que pegar seus dados por qual Parâmetro para que eu possa Deletar ou Alterar somente um registro por vez, para que os dados sejam mandados para o DELETE ou UPDATE do SLQ para que ele Deleta ou Altera o registro no banco de dados (uso Access).

 

Caso nao tenha entendido, reformulo a dúvida.

 

obrigado.

Reply to this Comment

Qual usar ?
By HELLFROST on Tuesday, January 18, 2005 (ESAST)

De todos os exemplos sobre passagem de Parâmetro este foi o mais explicado e melhor, e para eu continuar meus estudos, so uma opinião de quem ja tem muita experiência.

 

Sou iniciante em ASP.net e queria saber para meu caso, qual devo usar para passagem de Parâmetro. Estou tentando fazer o seguinte, todo o site tem sua área de manutenção, onde no ADM vamos la pra INSERIR, DELETAR e ALTERAR, se eu clicar para Alterar ou Deletar um registro, tenho que pegar seus dados por qual Parâmetro para que eu possa Deletar ou Alterar somente um registro por vez, para que os dados sejam mandados para o DELETE ou UPDATE do SQL para que ele Deleta ou Altera o registro no banco de dados (uso Access).

 

Caso nao tenha entendido, reformulo a dúvida.

 

obrigado.

Reply to this Comment

Delete
By Miguel Ferreira on Tuesday, January 18, 2005 (ESAST)

Olá Humberto,

 

Talvez o ideal fosse você criar um array/vetor com os dados que você quer deletar, passasse este array para dentro da funcao e executasse um loop, construindo o SQL, e deletando os registros.

 

[]'s

Reply to this Comment

Faça seu comentário...







O'Reilly