Você está na página 1de 6

VB .

NET - Parmetros e Argumentos -


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