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.14. Parameter Arrays - ParamArray

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.

Indien je een method wenst te creëren die een willekeurig aantal (nul of meerdere) parameterwaarden van zelfde datatype moet aanvaarden, kan je gebruik maken van een "parameterarray".

Een parameterarray definieer je door voor de definitie van een arrayvariabele in de parameterlijst het keyword ParamArray op te nemen.  Hierdoor zullen alle doorgeven parameterwaarden worden opgenomen als arrayelementen van dit arrayargument.
Deze parameterarray kan vervolgens als een gewone tabel in de implementatie worden gebruikt.
Visual Basic 2012 Broncode - Codevoorbeeld 185
Module Example1
    Sub Main()
        Console.WriteLine(GetSum(1, 2, 3, 4, 5))
        Console.WriteLine(GetSum(1, 2, 3, 4))
        Console.WriteLine(GetSum(1, 2, 3))
        Console.WriteLine(GetSum(1, 2))
        Console.WriteLine(GetSum(1))
        Console.WriteLine(GetSum())                                        ' (1)
        '
        Console.ReadLine()
    End Sub
    Function GetSum(ByVal ParamArray values As Integer()) As Integer
        If values IsNot Nothing Then
            For Each value As Integer In values
                GetSum += value
            Next
        End If
    End Function
End Module
Console Application Output
15
10
6
3
1
0
Een ParamArray van type Integer() kan dus een willekeurig aantal Integer expressies aannemen.

De mogelijkheid bestaat niets door te geven (1).  In dat geval werkt geval de functie implementatie hier met een Integer() array (dus bevat de value arrayvariabele een referentie van een array), maar bevat deze arrayinstantie geen elementen.  De controle op Nothing was voor deze aanroep dus niet noodzakelijk.

Parameterarrays zijn natuurlijk enkele maar bruikbaar indien men een willekeurig aantal (nul of meerdere) parameterwaarden wenst door te geven van hetzelfde datatype.

Men kan enkel "by value" (ByVal) werken met de doorgeven parameters bij het gebruik van een parameterarray.  ByRef ParamArray is dus een ongeldige combinatie.

Er kan slechts één ParamArray voorkomen in de parameterlijst van een method, en deze moet steeds als laatste parameter staan gedefinieerd.  Anders zou het onduidelijk kunnen zijn welke waarden aan welke parameter worden toegekend.

Een ParamArray kan niet gecombineerd worden met optionele argumenten.

Het is overigens ook mogelijk om aan de parameterarray argumentvariabele meteen een referentie door te geven van een array.
Visual Basic 2012 Broncode - Codevoorbeeld 186
Module Example2
    Sub Main()
        Dim values As Integer() = {1, 2, 3, 4, 5}
        Console.WriteLine(Example1.GetSum(values))
        '
        values = Nothing
        Console.WriteLine(Example1.GetSum(values))                        ' (1)
        '
        Console.ReadLine()
    End Sub
End Module
Console Application Output
15
0
Zoals we reeds weten is voor bovenstaand gebruik van de GetSum functie het ParamArray keyword niet noodzakelijk.

Een arrayvariabele bevat nooit een array zelf, maar bevat een referentie naar een arrayinstantie die elders in het geheugen bewaard wordt.  Een arrayvariabele die nog niet geïnitialiseerd is (of die dus nog naar geen enkele arrayinstantie verwijst) bevat nog geen verwijzing, maar bevat de defaultwaarde van een referencetype namelijk Nothing (in Visual Basic terminologie, of Null in .NET terminologie).

Het was dus noodzakelijk om de implementatie van GetSum een controle te doen op de inhoud van values.  Een For Each ... Next structuur zal immers een fout opleveren indien de collectie - waarnaartoe verwezen in de In clausule - Nothing bevat (1).

Voor de call op regel (1) van voorbeeld Example1 is deze controle overigens overbodig.  Het arrayargument value zal in deze situatie wel een referentie van een arrayinstantie bevatten, alleen zal deze arrayinstantie geen elementen bevatten.

8.14.1. Oefeningen

Opgave :

Breid onderstaande programmacode zo uit dat de calls naar de GetConcatenation functie ook ondersteund worden.
Visual Basic 2012 Broncode - Codevoorbeeld 187
Module Exercise1Task
    Sub Main()
        Console.WriteLine(Exercise1Solution.GetConcatenation("abc", "def", _
                                                             "ghi"))
        Console.WriteLine(Exercise1Solution.GetConcatenation("abc", "def"))
        Console.WriteLine(Exercise1Solution.GetConcatenation("abc"))
        Console.WriteLine(Exercise1Solution.GetConcatenation())
        '
        Dim words As String() = {"abc", "def", "ghi"}
        Console.WriteLine(Exercise1Solution.GetConcatenation(words))
        '
        words = Nothing
        Console.WriteLine(Exercise1Solution.GetConcatenation(words))
        '
        Console.ReadLine()
    End Sub
End Module
Console Application Output
abcdefghi
abcdef
abc

abcdefghi
Oplossing :
Visual Basic 2012 Broncode - Codevoorbeeld 188
Module Exercise1Solution
    Function GetConcatenation(ByVal ParamArray words As String()) As String
        If words IsNot Nothing Then
            For Each word As String In words
                GetConcatenation &= word
            Next
        End If
    End Function
End Module
Opgave :

Breid onderstaande programmacode zo uit dat de calls naar de methods GetArrayCopy en MultiplyIntegerValues ook ondersteund worden.
Visual Basic 2012 Broncode - Codevoorbeeld 189
Module Exercise2Task
    Sub Main()
        Dim values As Integer() = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
        Example1.PrintArray(values)
        '
        Dim count As Integer = 5
        Dim valuesCopy As Integer()
        valuesCopy = Exercise2Solution.GetIntegerArrayCopy(values, count)
        Example1.PrintArray(valuesCopy)
        '
        Dim factor As Integer = 4
        count = 3
        Exercise2Solution.MultiplyIntegerValues(valuesCopy, count, factor)
        '
        Example1.PrintArray(values)
        Example1.PrintArray(valuesCopy)
        '
        count = 6
        Exercise2Solution.MultiplyIntegerValues(values, count)
        '
        Example1.PrintArray(values)
        Example1.PrintArray(valuesCopy)
        '
        Console.ReadLine()
    End Sub
End Module
Console Application Output
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
4 8 12 4 5
2 4 6 8 10 12 7 8 9 10
4 8 12 4 5
Oplossing :
Visual Basic 2012 Broncode - Codevoorbeeld 190
Module Exercise2Solution
    Function GetIntegerArrayCopy(ByVal values As Integer(), _
                                 ByVal count As Integer) As Integer()
        Dim valuesCopy(count - 1) As Integer
        For index As Integer = 0 To count - 1
            valuesCopy(index) = values(index)
        Next
        GetIntegerArrayCopy = valuesCopy
    End Function
    Sub MultiplyIntegerValues(ByVal values As Integer(), _
                              ByVal count As Integer, _
                              Optional ByVal factor As Integer = 2)
        For index As Integer = 0 To count - 1
            values(index) *= factor
        Next
    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.