|
Dit artikel is gepubliceerd op zondag 31 juli 2011 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 2010 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 FunctionEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 2010 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 SubEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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.13.1. OefeningenOpgave :
Breid onderstaande programmacode zo uit dat de calls naar de GetConcatenation functie ook ondersteund worden. Visual Basic 2010 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 SubEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output abcdefghi
abcdef
abc
abcdefghi Oplossing : Visual Basic 2010 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 FunctionEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Opgave :
Breid onderstaande programmacode zo uit dat de calls naar de methods GetArrayCopy en MultiplyIntegerValues ook ondersteund worden. Visual Basic 2010 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 SubEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 2010 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 SubEnd ModuleDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|