Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

8.2. Argumenten - ByVal en ByRef

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

In de voorbeelden van vorige topic werd een algemene foutmelding getoond.  Het is niet ondenkbaar dat je zou verkiezen om een specifieke foutmelding te geven, die dan afhankelijk is van er juist fout liep.  Dit kan bereikt worden door ShowError te veranderen in ShowMenuError en ShowValueError toe te voegen.
Visual Basic 2012 Broncode - Codevoorbeeld 146
Module Example1
    Sub Main()
        Dim menu As Char
        Dim value As Decimal
        '
        Console.Write("1 centimetres -> inches / 2 - inches -> centimetres : ")
        menu = Console.ReadLine()
        Do Until menu = "1"c OrElse menu = "2"c
            ShowMenuError()
            Console.Write("1 centimetres -> inches / 2 - inches -> centimetres : ")
            menu = Console.ReadLine()
        Loop
        '
        Console.Write("Value : ")
        value = Console.ReadLine()
        Do Until value > 0
            ShowValueError()
            Console.Write("Value : ")
            value = Console.ReadLine()
        Loop
        '
        If menu = "1"c Then
            Console.WriteLine(value & " centimetres is " & value * 0.3937 & " inches")
        Else
            Console.WriteLine(value & " inches is " & value * 2.54 & " centimetres")
        End If
        '
        Console.ReadLine()
    End Sub
    Sub ShowMenuError()
        Console.WriteLine("An illegal menu option is chosen.  Please try again.")
    End Sub
    Sub ShowValueError()
        Console.WriteLine("The value should be above zero.  Please try again.")
    End Sub
End Module
Console Application Output
1 centimetres -> inches / 2 - inches -> centimetres : 3
An illegal menu option is chosen.  Please try again.
1 centimetres -> inches / 2 - inches -> centimetres : 4
An illegal menu option is chosen.  Please try again.
1 centimetres -> inches / 2 - inches -> centimetres : 1
Value : -5
The value should be above zero.  Please try again.
Value : -10
The value should be above zero.  Please try again.
Value : 10
10 centimetres is 3,937 inches
Een andere manier om dit aan te pakken is slechts één procedure te definiëren die een bepaalde (nog niet gedefinieerde) foutmelding zal tonen.
De foutmelding wordt hierbij dan niet statisch gedefinieerd, maar de procedure zal worden geparameteriseerd met de specifieke boodschap die wordt getoond.
Visual Basic 2012 Broncode - Codevoorbeeld 147
Module Example2
    Sub Main()
        Dim menu As Char
        Dim value As Decimal
        '
        Console.Write("1 centimetres -> inches / 2 - inches -> centimetres : ")
        menu = Console.ReadLine()
        Do Until menu = "1"c OrElse menu = "2"c
            ShowError("An illegal menu option is chosen.")
            Console.Write("1 centimetres -> inches / 2 - inches -> centimetres : ")
            menu = Console.ReadLine()
        Loop
        '
        Console.Write("Value : ")
        value = Console.ReadLine()
        Do Until value > 0
            ShowError("The value should be above zero.")
            Console.Write("Value : ")
            value = Console.ReadLine()
        Loop
        '
        If menu = "1"c Then
            Console.WriteLine(value & " centimetres is " & value * 0.3937 & " inches")
        Else
            Console.WriteLine(value & " inches is " & value * 2.54 & " centimetres")
        End If
        '
        Console.ReadLine()
    End Sub
    Sub ShowError(ByVal message As String)
        Console.WriteLine(message & "  Please try again.")
    End Sub
End Module
Console Application Output
1 centimetres -> inches / 2 - inches -> centimetres : 3
An illegal menu option is chosen.  Please try again.
1 centimetres -> inches / 2 - inches -> centimetres : 4
An illegal menu option is chosen.  Please try again.
1 centimetres -> inches / 2 - inches -> centimetres : 1
Value : -5
The value should be above zero.  Please try again.
Value : -10
The value should be above zero.  Please try again.
Value : 10
10 centimetres is 3,937 inches
Een "argument" (ook wel "parameter" genoemd) werd toegevoegd (tussen de haakjes) in de signatuur van de procedure.   Net als lokale variabelen zal dit argument een naam (identifier) krijgen en van een bepaald datatype zijn.  In plaats van een statisch gedefinieerde foutmelding, zal ShowError nu de parameter (of doorgegeven waarde) gebruiken.

Gebruik voor een argument steeds een identifier die zo duidelijk mogelijk de rol van deze parameter voor de procedure aangeeft.

Het keyword ByVal wordt verderop besproken.

De aanroepende procedure (hier Main) moet een String voorzien bij het aanroepen van deze nieuwe ShowError routine.  Deze String kan in eender welke vorm worden aangeboden, dit kan een String literal zijn, een String variabele, ... .
Visual Basic 2012 Broncode - Codevoorbeeld 148
Module Example3
    Sub Main()
        ShowMenuError()
        '
        Example2.ShowError("message 1")
        '
        Dim someMessage As String = "message 2"
        Example2.ShowError(someMessage)
        '
        Example2.ShowError("message" & " " & "3")
        '
        Example2.ShowError(Console.ReadLine())
        '
        Console.ReadLine()
    End Sub
End Module
Console Application Output
An illegal menu option is chosen.  Please try again.
message 1  Please try again.
message 2  Please try again.
message 3  Please try again.
message 4
message 4  Please try again.
Een procedure die in een module is gedefinieerde zal by default "public" zijn, of anders gesteld publiek beschikbaar zijn, en dus beschikbaar binnen andere modules.  De aanroep naar de ShowMenuError procedure in bovenstaand voorbeeld, is een aanroep naar de procedure gedefinieerd in module Example1.
Een aanroep naar ShowError zou ambigue zijn omdat verschillende publieke procedures deze identifier hebben (Example2.ShowError and Example2.ShowError).  Deze verwarring kan worden weggenomen door voor de naam van de procedure de naam van de module te vermelden.

8.2.1. By Value werken met Argumenten

By default zal een procedure werken met een kopie van de ontvangen argumentwaarde.  Dit is ook wat het keyword ByVal aangeeft.

In volgend voorbeeld voorziet Main waarde 5 aan MultiplyBy10.MultiplyBy10  zal een kopie van deze Integer waarde 5 toekennen aan zijn argumentvariabele value.

Beide procedures werken hier met hun eigen kopie van deze waarde.  Wanneer MultiplyBy10 deze waarde vermenigvuldigd met 10, zal enkel de waarde van MultiplyBy10 vermenigvuldigd worden.  De waarde van Main wordt niet veranderd.
Visual Basic 2012 Broncode - Codevoorbeeld 149
Module Example4
    Sub Main()
        Dim value As Integer = 5
        MultiplyBy10(value)
        Console.WriteLine("Main value : " & value)
    End Sub
    Sub MultiplyBy10(ByVal value As Integer)
        value *= 10
        Console.WriteLine("MultiplyBy10 value : " & value)
    End Sub
End Module
Console Application Output
MultiplyBy10 value : 50
Main value : 5

8.2.2. By Reference werken met Argumenten

Indien men toch manipulaties - die gebeuren op de argumentvariabelen van de aangeroepen procedure - effect wil laten hebben in de aanroepende procedure, kan men gebruik maken van ByRef.  Hier zal "by reference" (of met een verwijzing) worden gewerkt met de doorgegeven argumenten variabelen.
Visual Basic 2012 Broncode - Codevoorbeeld 150
Module Example5
    Sub Main()
        Dim value As Integer = 5
        MultiplyBy10(value)
        Console.WriteLine("Main value : " & value)
        '
        MultiplyBy10(value + 1)
        Console.WriteLine("Main value : " & value)
    End Sub
    Sub MultiplyBy10(ByRef value As Integer)
        value *= 10
    End Sub
End Module
Console Application Output
Main value : 50
Main value : 50
Procedure MultiplyBy10 zal nu niet zijn eigen kopie van de waarde beschikken, maar zal slechts over een verwijzing beschikken naar deze waarde uit Main.  Slechts een Integer instantie is hier in het geheugen aanwezig.
Wanneer MultiplyBy10 de waarde aanpast, zal dit dus de waarde van Main zijn die wordt aangepast.

Bemerk dat in bovenstaand voorbeeld de call MultiplyBy10(value + 1) geen wijziging teweeg brengt bij value van Main.  De value van MultiplyBy10 bevat hier een referentie naar een Integer instantie 51, die zich elders in het geheugen bevindt.  Het is deze Integer instantie die vermenigvuldigd wordt.
By reference werken met argumentwaarden heeft weinig zin indien de argumentwaarde niet wordt opgegeven via een expressie die louter naar een variabele verwijst.

By value werken met doorgegeven argumentwaarden wordt gebruikt bij "in" parameters, waarbij deze louter dienen als input voor de aangeroepen procedure.
By reference werken met doorgegeven argumentwaarden wordt gebruikt bij "out"- en "in/out" parameters, om ook een bepaalde output te bekomen.

Argumenten worden echter zelden gebruikt om output te bekomen uit een procedure, verderop zullen we elegantere methodes behandelen om dit effect te bereiken.

8.2.3. Meerdere Argumenten

Gebruik een komma om meerdere argumenten van elkaar te scheiden in de argumenten-lijst.
Visual Basic 2012 Broncode - Codevoorbeeld 151
Module Example6
    Sub Main()
        ShowSum(1, 2)
        '
        Console.WriteLine()
    End Sub
    Sub ShowSum(ByVal value1 As Integer, ByVal value2 As Integer)
        Console.WriteLine(value1 + value2)
    End Sub
End Module
Console Application Output
3
Men kan voor elke argument apart uitkiezen of men ByVal of ByRef wil werken.

8.2.4. Oefeningen

Opgave :

Probeer te voorspellen wat de uitvoer zal zijn van volgende module.
Visual Basic 2012 Broncode - Codevoorbeeld 152
Module Exercise1Task
    Sub Main()
        Dim x As Integer = 4
        Dim y As Integer = 5
        Dim z As Integer = 6
        '
        Test(x, y, z + 1)
        '
        Console.WriteLine("Main x : " & x)
        Console.WriteLine("Main y : " & y)
        Console.WriteLine("Main z : " & z)

        Console.ReadLine()
    End Sub
    Sub Test(ByRef y As Integer, ByVal z As Integer, ByRef x As Integer)
        z ^= 2
        x += z
        y += z
        '
        Console.WriteLine("Test x : " & x)
        Console.WriteLine("Test y : " & y)
        Console.WriteLine("Test z : " & z)
    End Sub
End Module
Oplossing :
Console Application Output
Test x : 32
Test y : 29
Test z : 25
Main x : 29
Main y : 5
Main z : 6
Opgave :
Creëer de module Exercise2Solution met de nodige procedures.
Visual Basic 2012 Broncode - Codevoorbeeld 153
Module Exercise2Task
    Sub Main()
        Dim number1, number2 As Integer
        '
        'Exercise2Solution.Input(number1, "Number 1 ? : ")
        'Exercise2Solution.Input(number2, "Number 2 ? : ")
        '
        'Exercise2Solution.ShowSmallest(number1, number2)
        '
        Console.ReadLine()
    End Sub
End Module
Console Application Output
Number 1 ? : 5
Number 2 ? : 4
Smallest : 4
Oplossing :
Visual Basic 2012 Broncode - Codevoorbeeld 154
Module Exercise2Solution
    Sub Input(ByRef value As Integer, ByVal message As String)
        Console.Write(message)
        value = Console.ReadLine()
    End Sub
    Sub ShowSmallest(ByVal value1 As Integer, ByVal value2 As Integer)
        Dim smallest As Integer = value1
        If value2 < smallest Then smallest = value2
        Console.WriteLine("Smallest : " & smallest)
    End Sub
End Module

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.