|
Dit artikel is gepubliceerd op woensdag 28 april 2010 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 Broncode 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())
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 ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
Visual Basic 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 Broncode 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))
Console.ReadLine()
End Sub
End ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
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.13.1. OefeningenOpgave :
Breid onderstaande programmacode zo uit dat de calls naar de GetConcatenation functie ook ondersteund worden. Visual Basic Broncode 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 ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
Visual Basic Output abcdefghi
abcdef
abc
abcdefghi Oplossing : Visual Basic Broncode 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 ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
Opgave :
Breid onderstaande programmacode zo uit dat de calls naar de methods GetArrayCopy en MultiplyIntegerValues ook ondersteund worden. Visual Basic Broncode 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 ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
Visual Basic 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 Broncode 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 ModuleDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
Dit artikel is gepubliceerd op woensdag 28 april 2010 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
Visual Basic 2008 & 2010 Boeken
Berichten
|