conceitos Os termos parmetros e argumentos so frequentemente usados de forma intercambiveis embora eles tenham significados inteiramente diferentes. Um parmetro representa um valor que o procedimento espera receber quando for chamado. A declarao do procedimento define os seus parmetros; Um argumento representa o valor que voc passa para um parmetro de procedimento quando voc chama o procedimento. O cdigo de chamada fornece os argumentos quando ele chama o procedimento; Vamos explicar melhor... Considere a seguinte funo que replica uma string um determinado nmero de vezes: Function RepeteString(ByVal Texto As String, ByVal Contador As Integer) As String Dim i As Integer For i = 1 To Contador RepeteString = RepeteString & Texto Next Return RepeteString End Function As variveis Texto e Contador so os parmetros da Funo RepeteString. Note que cada parmetro tem um tipo de dados associado. Agora quando voc for usar esta funo e a chamar, vai precisar substituir os parmetros por variveis, constantes ou literais. Exemplo: Module Module1 Sub Main() Console.WriteLine(RepeteString("Mac ", 10)) Console.ReadKey() End Sub Function RepeteString(ByVal Texto As String, ByVal Contador As Integer) As String Dim i As Integer For i = 1 To Contador RepeteString = RepeteString & Texto Next Return RepeteString End Function VB .NET - Parmetros e Argumentos - conceitos http://www.macoratti.net/13/05/vb_para1.htm 1 of 6 26-06-2014 15:22 End Module Neste exemplo quando chamamos a funo estamos fazendo a seguinte chamada: RepeteString("Mac ", 10) Os itens "Mac" e 10 que ns usamos no lugar dos parmetros so chamados argumentos. Ento temos: Function RepeteString(ByVal Texto As String, ByVal Contador As Integer) As String -> Parmetros = Texto e Contador 1. Console.WriteLine(RepeteString("Mac ", 10)) -> Argumentos = "Mac" e 10 2. Passando argumentos Os Argumentos podem ser passados para uma funo de dois modos: por valor ou por referncia. Muitas vezes a passagem de argumentos confundido com a passagem de parmetros, embora seja os argumentos e no os parmetros que esto sendo passados. A declarao o procedimento RepeteString dada no incio contm a palavra-chave ByVal na frente de cada um dos parmetros. Isto especifica que os argumentos so passados por valor para esta funo. Passar por valor significa que o valor real do argumento passado para a funo. Isso relevante quando um argumento uma varivel. Veja este exemplo: Public Class Form1 Dim idade As Integer = 20 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Incrementa(idade) MsgBox(idade) End Sub Sub Incrementa(ByVal x As Integer) x = x + 1 End Sub End Class O resultado exibido o valor 20 o que significa que a linha de cdigo : Incrementa(idade) No esta fazendo nada. A razo que o argumento idade passado para o procedimento Incrementa por valor (ByVal). Desde que somente o valor (neste caso 20) passado, esse valor atribudo a uma varivel VB .NET - Parmetros e Argumentos - conceitos http://www.macoratti.net/13/05/vb_para1.htm 2 of 6 26-06-2014 15:22 local chamada x dentro da funo. Esta varivel local x aumentada para 21, mas uma vez que o procedimento termina, a varivel local x destruda. Concluso : A varivel idade no passada para o procedimento logo e o seu valor no alterado. Vamos modificar o cdigo alterando a definio do procedimento Incrementa, substituindo ByVal por ByRef. Sub Incrementa(ByRef x As Integer) x = x + 1 End Sub Ao executarmos o cdigo novamente o resultado ser diferente... Neste caso que esta sendo passado para o procedimento Incrementa uma referncia ao argumento idade. Da, o procedimento na verdade opera na varivel passado para ele, incrementando o valor de idade para 21. Falando de outra forma, a varivel representada pelo parmetro x e na verdade a varivel idade que foi passada para o procedimento. No VB .NET , o mtodo padro de passagem de argumentos Por Valor (ByVal). Nota: nas primeiras verses da linguagem Visual Basic a passagem de argumentos padro era feita por referncia. Passando Objetos H uma sutileza na passagem de argumentos com parmetros de qualquer tipo de objeto. A sutileza ocorre porque uma varivel objeto um ponteiro, isto , ela contm uma referncia ao (ou o endereo do) objeto. Se passarmos uma varivel objeto, estamos passando o contedo da varivel, o qual o endereo do objeto. Assim, qualquer alterao feita na chamada do procedimento afeta o prprio objeto, no a cpia do objeto. VB .NET - Parmetros e Argumentos - conceitos http://www.macoratti.net/13/05/vb_para1.htm 3 of 6 26-06-2014 15:22 Esta parece ser a passagem feita por referncia, mas no . Pense desta forma: passando a valor do endereo de um objeto como passar uma referncia ao objeto. Por outro lado, se passarmos uma varivel objeto por referncia, estamos passando o endereo da varivel. Em outras palavras, estamos passando o endereo do endereo do objeto. Em linguagens que suportam ponteiros isto referido como um duplo ponteiro. Vamos ilustrar com um exemplo. Considere o seguinte cdigo, e imagine que o formulrio contendo esse cdigo tem duas caixas de texto: TextBox1 com o texto "TextBox1" e TextBox2 com o texto "TextBox2": Public Function GetTexto(ByVal txt As TextBox) As String ' Muda a referencia para o textbox txt = TextBox2 Return txt.ToString End Function Sub FazAlgumaCoisa() Dim t As TextBox t = TextBox1 GetTexto(t) MsgBox(t.Text) ' Exibe TextBox1 quando usamos ByVal e TextBox2 quando usamos ByRef End Sub Vamos analisar em detalhes o que acontece quando executamos o procedimento FazAlgumaCoisa(): 1- A passagem feita por valor (ByVal) O contedo do objeto TextBoxa atribuida a t: A funo GetTexto chamada, passando t por valor. A varivel t contm o valor do objeto TextBox1. Mas o argumento passado por valor recebe o contedo do objeto TextBox2 : txt = TextBox2 sendo retornado para o procedimento; Na ltima linha de cdigo temos a exibio do contedo da varivel t que "TextBox1". VB .NET - Parmetros e Argumentos - conceitos http://www.macoratti.net/13/05/vb_para1.htm 4 of 6 26-06-2014 15:22 2- A passagem feita por referncia (ByRef) Neste caso a funo GetTexto chamada passando t por referncia. Agora o argumento t passado por referncia contm o endereo da varivel e no o seu valor. Dessa forma txt t que recebe o valor do objeto TextBox2. O retorno da funo o valor de t que o mesmo que txt cujo valor agora "TextBox2" Argumentos Opcionais No VB .NET os parmetros podem ser declarados como opcionais usando a palavra chave Opcional, como mostrado no seguinte cdigo: Sub Calcular(Optional ByVal Switch As Boolean = False) Os parmetros opcionais devem ser declarados com o valor padro o qual passado para o procedimento se o programa chamador no fornecer o valor deste parmetro. As seguintes regras se aplicam aos argumentos opcionais: Cada argumento opcional deve especificar um valor padro, e esse padro deve ser uma expresso constante (e no uma varivel); Todo argumento seguindo um argumento opcional tambm deve ser opcional; Note que em verses anteriores do VB, voc podia omitir o valor padro e, se o parmetro fosse do tipo Variant, voc podia usar a funo IsMissing para determinar se um valor tinha sido fornecido. Isto no possvel no VB. NET, e a funo IsMissing no mais suportada. Usando ParamArray Normalmente, uma definio de procedimento especifica um nmero fixo de parmetros. No entanto, a palavra-chave ParamArray que indica uma matriz de parmetros, nos permite declarar um procedimento com um nmero indeterminado de parmetros. Portanto, cada chamada para o procedimento pode utilizar um nmero diferente de parmetros. Suponhamos, por exemplo, que queremos definir uma funo para tirar a mdia de uma srie de resultados de testes, mas o nmero de resultados pode variar. Ento vamos declarar a funo usando ParamArray da seguinte forma: Function GetMedia(ByVal ParamArray Resultados() As Single) As Single Dim i As Integer VB .NET - Parmetros e Argumentos - conceitos http://www.macoratti.net/13/05/vb_para1.htm 5 of 6 26-06-2014 15:22 For i = 0 To UBound(Resultados) GetMedia = GetMedia + CSng(Resultados(i)) Next GetMedia = GetMedia / (UBound(Resultados) + 1) End Function Agora podemos fazer chamadas a essa funo variando o nmero de argumentos: MsgBox(GetMedia(1, 2, 3, 4, 5)) ou MsgBox(GetMedia(1, 2, 3)) ou MsgBox(GetMedia(1, 2, 3, 4)) As seguintes regras aplicam-se utilizao de ParamArray: Um procedimento s pode ter uma matriz de parmetro, e deve ser o ltimo parmetro no procedimento. A matriz de parmetro deve ser passada por valor, e voc deve incluir explicitamente ByVal no procedimento de definio. A matriz de parmetro deve ser uma matriz unidimensional. Se o tipo no declarado, assumido como object. A matriz de parmetros automaticamente opcional. Seu valor padro uma matriz de parmetros vazia unidimensional do tipo dados da matriz dos parmetro. Referncias: Seo VB .NET do Site Macoratti.net Super DVD .NET - A sua porta de entrada na plataforma .NET Super DVD Vdeo Aulas - Vdeo Aula sobre VB .NET, ASP .NET e C# Seo C# do site Macoratti.net http://msdn.microsoft.com/en-us/library/9kewt1b3.aspx VB.NET - Lendo parmetros da linha de comando - Macoratti.net VB.NET - Passagem de parmetros - Macoratti.net Jos Carlos Macoratti VB .NET - Parmetros e Argumentos - conceitos http://www.macoratti.net/13/05/vb_para1.htm 6 of 6 26-06-2014 15:22