De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Hoofdstuk 4 - Procedures en arrays

Verwante presentaties


Presentatie over: "Hoofdstuk 4 - Procedures en arrays"— Transcript van de presentatie:

1 Hoofdstuk 4 - Procedures en arrays
Inleiding Modules, Klassen en Procedures Sub procedures Function procedures Methoden Argument promotie Option Strict en data type conversie Value types en Reference Types Doorgeven van argumenten : By Val en By Ref Duur van identifiers Scope regels Recursie Procedure overloading en optionele argumenten Modules Arrays Doorgeven van Arrays aan procedures Doorgeven van Arrays : By Val of ByRef Multidimensionele arrays Visual Basic.NET

2 4.1 Inleiding Divide en Conquer :
deel applicatie op in deelproblemen. Dat maakt de applicatie eenvoudiger te debuggen en te onderhouden! Deel programma op in kleine, beheersbare stukjes. In dit hfdstuk zien we een aantal technieken Arrays zijn statisch, ze blijven dezelfde grootte behouden. In hoofdstuk 20 over data structuren en collections worden dynamische structuren geintroduceerd zoals lijsten, queues, stacks en trees Visual Basic.NET

3 4.2 Modules, Klassen en Procedures
Framework Class Library (FCL) Bevat veel “prepackaged” klassen en methodes om tal van bewerkingen uit te voeren Programmer-defined procedures 3 type van procedures Sub procedures Function procedures Event procedures Een procedure wordt aangeroepen met een procedure call Voordelen van procedures Divide-and-conquer benadering maakt applicatie eenvoudiger te debuggen en onderhouden Software herbruikbaarheid Vermijden van duplicatie van code in een programma De FCL (de basisklassenbibliotheek) vereenvoudigt het programmeerwerk daar ze voorziet in veel ingebouwde klassen en methodes voor de uitvoering van ingewikkelde en simpele taken, die een programmeur vaak nodig heeft. We hebben reeds de klasse Console gezien met methodes om tekst naar de console te schrijven of te lezen. Schrijf enkel “programmer defined procedures” om eigen vereisten van een specifiek probleem op te lossen. Er bestaan 3 types procedures. - de sub procedure gebruikt voor het uitvoeren van specifieke taken, zoals het genereren van een orderid, of het tot stand brengen van een verbinding met de db. Deze procedures retourneren geen waarde aan het oproepend statement - de function procedure : eveneens gebruikt voor het uitvoeren van specifieke taken maar deze retourneert een waarde aan het oproepend statement. - event procedure : uitvoeren van specifieke taken als actie op een bepaalde gebeurtenis. Een procedure wordt opgeroepen obv een procedure call. In de procedure call geef je de naam van de procedure op en de parameters die de callee nodig heeft om zijn job uit te voeren. Wanneer de procedure is uitgevoerd, wordt de controle terug aan de caller gegeven. In een aantal gevallen retourneert de procedure ook een waarde naar de caller. Deze hiding van implementatie details leidt tot het maken van goede software Alle uitvoerbare code van je applicatie staat in procedures; Tijdens de ontwerpfase van een applicatie kan het ene team zich bezighouden met de gebruikersinterface en het andere team met de flow en de applicatielogica Voordelen Ze verschaffen de mogelijkheid code logisch te groeperen in taken. Wanneer een complexe applicatie is verdeeld in procedures, is de code flexibele en gemakkelijker te onderhouden en te debuggen. Procedures bieden volgende voordelen : - de code in een procedure is hetgebruikbaar. Nadat een procedure is gemaakt en getest, kan deze worden aangeroepen vanuit verschillende plaatsen in de applicatie - de applicatie is eenvoudiger te debuggen en onderhouden, omdat je de oorsprong van de fout eenvoudig kan achterhalen in een procedure en niet de hele applicatie op fouten hoeft te controleren. Visual Basic.NET

4 4.3 Sub Procedures Voorbeeld : Console applicatie voor printen van verloning van werknemers 1 ‘ Payment.vb 2 ' Sub procedure that prints payment information. 3 4 Module modPayment 5 Sub Main() 7 PrintPay ontvangt de waarden van elk argument en plaatst deze in de parameter variabelen hours en wage ' call Sub procedure PrintPay 4 times PrintPay(40, 10.5) PrintPay(38, 21.75) PrintPay(20, 13) PrintPay(50, 14) 13 Console.ReadLine() ' prevent window from closing PrintPay wordt uitgevoerd, wanneer het aangeroepen wordt in de Main End Sub ' Main 16 ' print amount of money earned in command window Sub PrintPay(ByVal hours As Double, ByVal wage As Decimal) 19 ' pay = hours * wage Console.WriteLine("The payment is {0:C}", hours * wage) End Sub ' PrintPay The payment is $420.00 The payment is $826.50 The payment is $260.00 The payment is $700.00 Opm : PrintPay bevindt zich in de module modPayment. Alle procedures moeten gedefinieerd zijn binnen een module of klasse De programma’s tot nu toe gezien bevatten minstens 1 procedure (vb. Main) die de FCL methodes (console.writeline) aanriepen om hun werk uit te voeren. Voorbeeld van een console applicatie die gebruik maakt van een SUB (aangeroepen vanuit de Main) voor het printen van de verloningsinfo van werknemer.Het programma bevat 2 procedure definities. - lijn 6-14 : Main, die wordt uitgevoerd als de console applicatie geladen wordt - lijn : PrintPay aangeroepen vanuit de main. In de Main gebeuren 4 oproepen, waardoor de procedure 4 keer wordt uitgevoerd. Wanneer Main Printpay aanroept, maakt hij een kopie van de waarden van elk argument en wordt de programmacontrole doorgegeven aan de eerste lijn code in de procedure Printpay. Procedure Printpay ontvangt de waarden en plaatst deze in de variabele hours en wage. Vervolgens berekent Printpay het resultaat en. Wanneer de End sub beriekt wordt de controle terug gegeven aan main. PrintPay bevindt zich in de module. Procedures moeten steeds gemaakt worden binnen een klasse of module. De procedure definieert 2 parameters BYVAL. Dit betekent dat een copie van de waarden van de argumenten dient te worden doorgegeven. 23 24 End Module ' modPayment Visual Basic.NET

5 4.3 Sub Procedures Procedure header : de eerste lijn
Syntax definitie van procedure Sub procedure-name(parameter-list) declarations and statements End Sub Bestaat uit Procedure header : de eerste lijn Sub : geeft aan dat het om een Sub-procedure gaat Procedure-name : de naam van de procedure. Moet een geldige identifier zijn Parameter-list : komma seperated lijst met argumenten (naam en type) die dient te worden doorgegeven aan de procedure Procedure body : de declaraties en uit te voeren instructies End Sub : einde procedure Visual Basic.NET

6 4.3 Sub Procedures Oproepen van een sub procedure
procedure-name(parameter-list) Parameter-list : komma seperated lijst met argumenten die dienen te worden doorgegeven aan de procedure. Moet overeenkomen met parameter-lijst in procedure header in termen van Aantal Type Volgorde Als procedure-header geen parameterlijst bevat dan moet bij het aanroepen de procedure_name gevolgd worden door () Compabiliteit : een double parameter kan bvb een waarde 7.35 of -22 ontvangen maar niet Hello. Visual Basic.NET

7 4.4 Function Procedure Retourneren een waarde!
Syntax Functie definitie Function procedure-name(parameter-list) As return-type declarations and statements End Function Return-type : gegevenstype van de returnwaarde Return statement Kan om het even waar staan en kan meerdere malen voorkomen in de function body Retourneert de waarde van de procedure (1 waarde, eventueel na typeconversie) Controle wordt onmiddellijk teruggegeven aan oproepend programma. Visual Basic.NET

8 4.4 Function Procedure Oproepen van een functie
Variabele = procedure-name(parameter-list) - Als uitdrukking in return statement niet geconverteerd kan worden naar return-type => runtime error - Als return statement niet wordt uitgevoerd bij een function call of return statement vergeten => runtime error - Probeer zoveel mogelijk functies te schrijven met 1 return statement, I.p.v. meerdere return statements (nl. 1 per mogelijke waarde) Visual Basic.NET

9 4.4 Function Procedure Voorbeeld : berekenen machtsverheffing
1 ' SquareInteger.vb 2 ' Function procedure to square a number. 3 4 Module modSquareInteger 5 Sub Main() Number Square Dim i As Integer ' counter 8 Console.WriteLine("Number" & vbTab & "Square" & vbCrLf) 10 ' square numbers from 1 to 10 For i = 1 To 10 Console.WriteLine(i & vbTab & Square(i)) Next 15 End Sub ' Main 17 Berekent de machtverheffing voor de integers 1 tot 10. De for structuur toont het resultaat van de machtsverheffing. Iedere uitvoering van de For roept de functie op en geeft argument i door.Dan maakt programma een copy van de waarde i en geeft programma controle door aan eerste lijn code in functie. Functie square ontvangt copy en plaatst de waarde in de variabele y (byval). De waarde van de machtsverheffing wordt berekend en geretourneerd op lijn 21.Dit wordt naar de console geschreven op lijn 13 Moest er na de return op lijn 22 staan messagebox.show(“test”), dan zou dit nooit worden uitgevoerd. Return beeindigt de uitvoering van de functie. Je kan ook ipv vtab ControlChars.Tab gebruiken ' Function Square is executed ' only when the function is explicitly called. Function Square(ByVal y As Integer) As Integer Return y ^ 2 End Function ' Square 23 Het Return statement beëindigt de uitvoering van de procedure en retourneert het resultaat y ^ 2 24 End Module ' modSquareInteger Visual Basic.NET

10 4.5 Methodes Methoden zijn procedures (sub of functies) binnen een klasse. FCL methode Custom methode in een programmer-defined klasse Voorbeeld Tot nu toe : interactie met gebruiker via console (gebruiker geeft een waarde in) en messagebox (tonen van een bericht en gebruiker klikt op OK). Deze interactie is echter nogal beperkt. De console aanvaardt maar 1 lijn input/keer, en een messagebox kan maar 1 boodschap per keer tonen. Vaak zijn meerdere inputs vereist. Dit programma introduceert GUI Event Handling Visual Basic.NET

11 4.5 Methods Alle formulieren erven van de klasse System.Windows.Forms.Form 1 ' Maximum.vb 2 ' Program finds the maximum of three numbers input. 3 4 Public Class FrmMaximum Inherits System.Windows.Forms.Form 6 ' prompts for three inputs Friend WithEvents lblOne As System.Windows.Forms.Label Friend WithEvents lblTwo As System.Windows.Forms.Label Friend WithEvents lblThree As System.Windows.Forms.Label 11 ' displays result Friend WithEvents lblMaximum As System.Windows.Forms.Label 14 ' read three numbers Friend WithEvents txtFirst As System.Windows.Forms.TextBox Friend WithEvents txtSecond As System.Windows.Forms.TextBox Friend WithEvents txtThird As System.Windows.Forms.TextBox 19 ' reads inputs and calculate results Friend WithEvents cmdMaximum As System.Windows.Forms.Button 22 ' Visual Studio .NET generated code 24 Declaratie van alle controls in de GUI. Code wordt gegenereert bij ontwerpen van formulier a.d.h.v. Toolbox Visual Basic.NET

12 4.5 Methods Event handler cmdMaximum_Click Handelt de gebeurtenis “muisklik op Button cmdMaximum” af 4.5 Methods ' obtain values in each text box, call procedure Maximum Private Sub cmdMaximum_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdMaximum.Click Dim value1, value2, value3 As Double 30 value1 = txtFirst.Text value2 = txtSecond.Text value3 = txtThird.Text 34 lblMaximum.Text = Maximum(value1, value2, value3) End Sub ' cmdMaximum_Click 37 ' find maximum of three parameter values Function Maximum(ByVal valueOne As Double, _ ByVal valueTwo As Double, ByVal valueThree As Double) 41 Return Math.Max(Math.Max(valueOne, valueTwo), valueThree) End Function ' Maximum 44 45 End Class ' FrmMaximum Opvragen van de inhoud van de 3 TextBoxes a.d.h.v. de Text property Visual Basic.NET

13 Addendum : De Math klasse
Visual Basic.NET

14 Addendum : Gegevenstypen in VB.NET
Een variabele verwijst naar een geheugenblok dat informatie opslaat. Die informatie die is opgeslagen in een variabele is van een bepaald gegevenstype. De types waarmee je werkt moeten begrepen worden door de compiler. De compiler van de taal waarmee je werkt heeft regels die de toegestane gegevenstypes definiëren, en de vertegenwoordigers die je definieert moeten bestaan binnen de parameters van de gedefinieerde typen die de compiler kan begrijpen. Het .NET framework gebruikt het concept van gegevenstypen die voldoen aan de eisen van de CLS (Common Language Specification). Dit betekent dat elke .NET compiler minstens een aantal gegevenstypen toestaan. Zo niet, voldoet de compiler niet aan de eis CLS-compliant taal. Als je een applicatie schrijft in VB.NET en de gegevenstypen gebruikt die CLS-compliant zijn, dan kan elke andere taal in het .NET framework informatie uitwisselen met je applicatie. Dit is belangrijk voor de interoperabiliteit van de talen in het framework (wat vroeger heel moeilijk was bvb string gegevens uitwisselen tussen dll in C++ geschreven en VB programma). In VB.Net zijn de toegestane gegevenstypen CLS-compliant. In het .NET framework zijn alle gegevenstypen afgeleid van de namespace SYSTEM. Omdat alle objecten in .NET zijn afgeleid van het basistype System.Object zijn de gegevenstypen die je eigenlijk gebruikt klassen en structuren die zijn afgeleid van het type System.Object. Alle klassen hebben members, eigenschappen en velden, en dat geldt ook voor de gegevenstypes die gedefinieerd zijn in de namespace System. Bvb dim x as Single=123.45 messagebox.show(x.tostring) De variabel x heeft een methode aanroep voor de member tostring. In pre VB.NET gebruikte men ingebouwde numerieke gegevenstypen met ingebouwde functies als cstr,... In .NET kan je dit nog gebruiken (probeer dit te vermijden), maar heb je de verschillende .NET methoden en eigenschappen waarvan de typen zijn afgeleid. Wanneer je geen type definieert, dan gebruik je late binding. Het standaard type is dan Object. Late binding betekent dat de compiler het type niet kent tijdens runtime en gedwongen wordt de gegevens te converteren voor ze kunnen worden gebruikt. Dit gaat ten koste van de prestaties Gehele getallen : small, integer en long. Enkel het aantal bytes nodig voor de opslag verschilt (16 bit, 32 bit, 64 bit), het bereik genoemd. Hierin kan je een gehaal getal opbergen zoals –15, +23,0. Een signed small heeft een bereik van tot Een unsigned single : 0 tot Decimal : fixed point . Is een exact numeric datatypes <> approximate. Bij decimal kan je exact opgeven hoeveel cijfers na de komma; Approximate : Bvb 1/3 = 0, Kan niet exact worden opgeslaan, maar wordt bij benadering opgeslaan. Single en Double slaan niet alle cijfers na de komma op, maar een benadering. Decimal : decimale getallen met een vast aantal decimalen (fixed point), Cijfers na de komma zonder afrondingsfouten. Gebruiken voor financiele berekeningen, waar afrondingsfouten niet getolereerd worden Single, double = decimaal getal met een variabel aantal decimalen (floating point). Hebben een groter bereik dan decimal maar kunnen afrondingsfouten hebben. Bij floating point gaat het om significante cijfers en niet om het aantal cijfers voor of na de decimale punt. De weergave is doorgaans in wetenschappelijke notatie 1,234567E3 = ; 7,655432E-8 = 0, Visual Basic.NET

15 4.6 Argument Promotie Voorbeeld : Console.Write (Math.Sqrt(4))
Coercion (afdwingen) van argumenten : Afdwingen dat argumenten van het geschikte data type zijn zodat ze kunnen worden doorgegeven aan de procedure. Widening conversie (uitbreiden) : een type converteert naar een ander type zonder gegevensverlies Voorbeeld : Console.Write (Math.Sqrt(4)) Narrowing conversie(verkleinen) : Conversie probeert de gegevens van een groter type te converteren naar een kleiner type (in bytes of precisie) wat aanleiding kan geven tot gegevensverlies Voorbeeld Dim X As Single Dim Y As Integer Y=X Console.Write (Math.Sqrt(4)); Methode Sqrt werd gedefinieerd met inputparameters van het type double. Public Shared Function Sqrt( ByVal d As Double ) As Double Het verwacht een double. Als ik de methode aanroep met een integer, dan wordt de methode toch correct uitgevoerd. VB promoot (converteert) de integer waarde 4 naar een double 4.0 alvorens de waarde door te geven aan de procedure=> impliciete widening conversie. Stel dat de string variabele Number de waarde 4 bevat dan zal Math.Sqrt(number) ook correct worden uitgevoerd. Maar het kan ook fout gaan als number bvb “Hello” bevat, dan krijgen we een runtime error. Evalueert eerst Mat.Sqrt(4), dan de console.write(2) Getallen achter de komma gaan verloren Visual Basic.NET

16 4.6 Argument Promotie Promotie naar “hoger” data type in uitdrukking
Toegestane bereiken bij typeconversie (promotieregels) Eveneens van toepassing op gemengde uitdrukkingen Promotie naar “hoger” data type in uitdrukking Voorbeeld : Dim X As Single, Y As Double Y+=X Argument promotie is niet enkel van toepassing op primitieve-data-type values die doorgegeven worden aan een procedure. Maar ook voor uitdrukkingen die meer dan 1 waarde bevat (vb een optelling)., een mixed type expressie genoemd. In dit geval wordt elke waarde gepromoot naar de “highest” data type in de uitdrukking. Dit betekent dat widening conversie gebruikt wordt tot alle waarden van hetzelfde type zijn. Bvb een single waarde optellen met een integerwaarde, dan zal VB de integerwaarde converteren naar een single waarde, het resultaat berekenen. Het resultaat is dan van type Single. Visual Basic.NET

17 4.7 Option Strict en Data-Type Conversie
Option Explicit Vereist dat variabelen gedeclareerd worden voor gebruik Defaultwaarde : ON Instellen Op projectniveau : aanpassen van property pages In klasse- of modulebestand : statement “Option Explicit ON” Stel dit in op ON! Option Strict Laat geen impliciete narrowing conversie toe=> expliciete conversie Defaultwaarde : OFF Instellen : idem Option Explicit VB voorziet in een aantal opties om te bepalen hoe een compiler datatypes behandelt. Option explicit : Het option explicit dwingt je de variabelen te declareren voordat je er in de code naar verwijst. Je kan dit instellen in het eigenschappendialoogvenster op projectniveau (rechtermuisklik op project in Solution Explorer > Properties > opent de property pages) > Common properties > Build, of het statement “option explicit on|off” kan je bovenaan je klassebestanden of modulen toevoegen (boven de import statements). Als de optie aan staat en je probeert te verwijzen naar een variabele die nog niet is gedeclareerd, zal de IDE een foutmelding geven tijdens het schrijven van de code. Goed om tikfouten te vermijden. Option strict : Om er zeker van te zijn dat er geen conversiefouten in je code voorkomen, moet je de option strict instellen op On. Dit laat statements voor widening conversie toe, maar genereert een compilatiefout als wordt gepoogd een narrowing conversie uit te voeren die gegevensverlies veroorzaakt (van double naar integer) of een runtime fout (van string “hello” naar integer) zou kunnen genereren. Het dwingt de programmeur om expliciete conversie te doen voor alle narrowing conversies. Dit statement kan je bovenaan je klassebestanden of modulen toevoegen, of op projectniveau door de eigenschappen van het project te wijzigen. Visual Basic.NET

18 4.7 Option Strict en Data-Type Conversie
De Namespace System.Convert Bevat methodes om datatypes expliciet te converteren. Voorbeeld (als Option Strict On): Dim number As Integer Number = Convert.ToInt32(Console.Readline()) De klasse Convert kan worden gebruikt om data types expliciet te converteren. Elke methode start met de letters to, gevolgd door naam data type.Vb conversie van string naar integer (type int32 in .NET) als option strict on. Als off dan doet VB zelf de conversie . Als de conversie niet lukt => runtime fout. Visual Basic.NET

19 4.8 Value Types en Reference Types
Variabele van value type Bevatten de data Gebruikt voor 1 stukje data Datatypes Built-in’s : byte, short, integer, long, double, single,boolean, date, decimal, char Programmer-defined : Structure, enumerations Voorbeeld Dim int1 As Integer = 5 Dim int2 As Integer int2 = int1 int1 = 10 int1 int2 Alle datatypes in VB kunne gecatalogeerd worden als value type of reference type. Value types worden gebruikt voor voor 1 stukje data, zoals integer of double. Reference type bevat een geheugenplaats waar de data wordt opgeslaan. De geheugenplaats kan veel individuele stukje data bevatten. Reference types zijn gekend als objecten. Zowel de alue types als de reference types bevatten built in types en types die de ontwikkelaar kan creeeren. De built in value types omvatten - gehele getallen: byte, short, integer, long - floating point : double en single andere types : boolean, date, decimal, char In het voorbeeld : voor deze datatypes bevat de variabele de waarde. Als int1 initieel de waarde 5 bevat, en we creeeren een andere variabele int2, die ook de waarde 5 heeft. Dit betekent dat elk van de variabelen elk hun eigen De builtin reference types : object en string De value types die een programmeur kan creëeren : Structure en Enum(eration) De reference types die een programmeur kan maken : klassen interfaces en delegates. Alhoewel deze simple data types, toch verschillend behandeld worden dan objecten nl ze bevatten de actuele waarde en geen referentie, kunnen we deze value types toch behandelen alsof ze objecten zijn. Dit is het key concept in .NET : alles is een object, zelfs de eenvoudige data types. Bvb Dim int1 as integer = 42 Int1+=10 Maar we kunnen ook een methode aanroepen van deze variabele, want int1 bevat niet enkel een integer waarde, maar bevat ook een object representatie van die waarde. Bvb de Gettype methode geeft het onderliggende datatype terug Messagebox.show(int1.GetType()) Dit geeft als resultaat een messagebox met de tekst System.Int32 (wat het onderliggende .NET datatype is voor de VB integer Visual Basic.NET

20 4.8 Value Types en Reference Types
Variabele van reference type Variabele bevat een verwijzing naar het object Gekend als objecten Datatypes : Built-in’s : String en Object Programmer- defined : klassen, interfaces, delegates Voorbeeld Dim obj1 As New TheClass() Dim obj2 As TheClass obj2 = obj1 obj1 obj2 De reference types die een programmeur kan maken : klassen interfaces en delegates. In voorbeeld : Als we een nieuw object creeeren gebruik makend van New keyword, dan slaan we een verwijzing naar het object op in de variabele. Deze code creeert een nieuwe instantie van TheClass. We hebben toegang tot dit nieuw object via de obj1 variabele. Deze variabele bevat een verwijzing naar het object. Als we nu een tweede variabele , obj2, creeeren die ook een verwijzing bevat naar hetzelfde object. Dan kunnen we beide variabelen gebruiken , daar ze beide refereren naar exact hetzelfde object. Belangrijk is te weten dat de variabele die we hebben NIET het object zelf is, maar juist een verwijzing of een pointer naar het object zelf. Visual Basic.NET

21 4.8 Value Types en Reference Types
Literals Hard gecodeerde waarden in de code Moet overeenstemmen met 1 van de primitieve data types. Bvb Dim price As Object = 992.4D ‘dwingt decimal type af Identifier type tekens zijn nog steeds toegestaan bij het declareren van variabelen in VB.NET (zou men eigenlijk moeten afschaffen). Dit biedt een verkorte manier om variabelen te declareren. Ipv het eigenlijke gegevenstype te gebruiken voor het declareren van een variabele, kun je een teken gebruiken die de gegevenstype waarnaar je verwijst vertegenwoordigt. Je kan er bvb voor kiezen alle variabelen te declareren van het type object. In dat geval kan je afdwingen dat literals van een bepaald type zijn door gebruik te maken van het literal type teken direct achter het literal type. Visual Basic.NET

22 4.9 By-Value en By-Reference
Doorgeven van argumenten aan een procedure Doorgeven By Value (via de waarde) Er wordt een copie van de waarde doorgegeven aan de procedure. Dit heeft tot gevolg dat de actuele waarde van de variabele bij aanroep niet door de procedure kan worden aangepast. Keyword ByVal Doorgeven By Reference (adhv een referentie) Er wordt een pointer naar (het adres van) het argument doorgegeven aan de procedure. De procedure heeft rechtstreeks toegang tot de actuele waarde en kan deze ook aanpassen. KeyWord ByRef Argument tussen (), worden steeds By Value doorgegeven Reference types worden steeds By Reference doorgegeven Gebruik : Doorgeven by ref : enkel indien de procedure de waarde van de parameter dient aan te passen. Reference type variabelen doorgegeven met keyword byVal worden toch by reference doorgegeven. Opmerking : byRef past waarde aan. Als je een functie gebruikt, dan zal return de waarde steeds retourneren ByVal Visual Basic.NET

23 4.9 By-Value en By-Reference
'ByRefTest.vb : Demonstrates passing by reference. Module modByRefTest ' squares three values ByVal and ByRef, displays results Sub Main() Dim number As Integer = 2 Console.WriteLine("Before entering SquareByValue number is {0}", number) SquareByValue(number) ' passes number by value Console.WriteLine("After exiting SquareByValue number is {0}" & vbCrLf, number) number = 2 Console.WriteLine("Before entering SquareByRef number is {0}", number) SquareByRef(number) ' passes number by reference Console.WriteLine("After exiting SquareByRef number is {0}" & vbCrLf, number) Console.WriteLine("Before entering SquareByRef number is ({0})", number) SquareByRef((number)) ' passes number by value End Sub Sub SquareByValue(ByVal number As Integer) number *= number Console.WriteLine("Before exiting SquareByValue number is {0}", number) End Sub ' SquareByValue ' squares number by reference (note ByRef keyword) Sub SquareByRef(ByRef number As Integer) Console.WriteLine("Before exiting SquareByRef number is {0}", number) End Sub ' SquareByReference End Module ' modByRefTest Bij ByVal wordt een copie van de waarde doorgegeven ByRef geeft directe toegang tot de waarde in de originele variabele Het plaatsen van het argument tussen haakjes dwingt pass-by-value af Programma geeft 3 waarden door - 1 by val => Na uitvoering procedure bevat number nog steeds dezelfde waarde - 1 by ref => na uitvoering procedure is de waarde van variabele number aangepast - 1 waarvan argument tussen haakjes (dus toch byref) Visual Basic.NET

24 4.10 Duur van identifiers Identifier’s duration (lifetime)
Periode dat de identifier in het geheugen bestaat Identifier’s scope Bepaalt waar de variabele gebruikt kan worden in het programma Automatic duration Identifiers gedeclareerd als locale variabelen in een procedure hebben automatic duration Instance variable Een variable gedeclareerd in een klasse of module buiten een procedure Bestaan zolang klasse in geheugen geladen Visual Basic.NET

25 4.11 Scope regels Class scope Module scope Namespace scope Block scope
Variabelen gedeclareerd in een klasse, buiten een procedure, hebben een class scope. Scope begint na keyword Class en eindigt bij End Class statement Module scope Variabelen gedeclareerd in een module, buiten een procedure, hebben module scope, wat vergelijkbaar is met class scope Namespace scope Procedures gedefinieerd in een module hebben per default namespace scope, wat betekent dat ze toegankelijk zijn in het volledige project Block scope Identifiers gedeclareerd binnen een blok (bvb body van If/then, of van een procedure) hebben blok scope Klasse scope : Variabelen gedeclareerd in een klasse, buiten een procedure, hebben een class scope. Scope begint na keyword Class en eindigt bij End Class statement. Deze scope laat toe dat alle members uit de klasse toegang hebben tot deze procedure of variabele, en ook de members uit klassen die van die klasse geerfd hebben. Namespace scope : Procedures gedefinieerd in een module hebben per default namespace scope, wat betekent dat ze toegankelijk zijn in het volledige project. Een project die bvb een klasse en een module bevat, dan kunnen methodes uit de klasse de procedures en variabelen uit de module gebruiken. Blok scope : Identifiers gedeclareerd binnen een blok (bvb body van If/then, of van een procedure) hebben blok scope. Als blokken genest zijn en als de variabele in een inner blok dezelfde naam heeft als een variabele in een outer blok krijg je een een fout. Daarentegen, als een lokale variabel in een procedure dezelfde naam heeft als een class scope variabele, de class scope variabel is hidden totdat de uitvoering van de procedure beëindigd is. Visual Basic.NET

26 1 ' Scoping.vb 2 ' Demonstrates scope rules and instance variables. 3 4 Public Class FrmScoping Inherits System.Windows.Forms.Form 6 Friend WithEvents lblOutput As System.Windows.Forms.Label 8 ' Windows Form Designer generated code 10 ' instance variable can be used anywhere in class Dim value As Integer = 1 13 ' demonstrates class scope and block scope Private Sub FrmScoping_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 17 ' variable local to FrmScoping_Load hides instance variable Dim value As Integer = 5 20 lblOutput.Text = "local variable value in" & _ " FrmScoping_Load is " & value 23 MethodA() ' MethodA has automatic local value MethodB() ' MethodB uses instance variable value MethodA() ' MethodA creates new automatic local value MethodB() ' instance variable value retains its value 28 lblOutput.Text &= vbCrLf & vbCrLf & "local variable " & _ "value in CScoping_Load is " & value End Sub ' FrmScoping_Load 32 33 Declaratie instance variabele value. Deze variabele is hidden voor alle procedures met een lokale variabele met naam value Voorbeeld van scoping met instance variabelen en lokale variabelen (een formulier met 1 lbale met de naam lblOutput) Lijn 12 : Instance variabele VALUE gedeclareerd en geinitialiseerd. Deze variabele is hidden voor alle procedures waarin een variabel met die naam gedeclareerd wordt. De procedure FrmScoping_load declareert een variabele VALUE (lijn 19) die de waarde 5 krijgt. De waarde van de variabele wordt getoond in het label lblOutput. Het toont de waarde 5 en niet de waarde 1. Dus instance variabel is hidden voor deze procedure Het programma definieert nog 2 andere methodes : MethodA en B, die geen parameters nodig hebben en geen waarde retourneren. Methode A (lijn 34) definieert een lokale variabel value (lijn 35) met de waarde 25. Bij het uitvoeren van method1 wordt de waarde van de variabele getoond in de lblOutput, vervolgens met 1 opgehoogd, en waarde wordt opnieuw getoond.De variabele value wordt automatisch vernietigd bij het beeindigen van de procedure. Dus telkens de procedure wordt aangeroepen wordt de variabele opnieuw gecreeerd en gereinitialiseerd op 25 MethodB declareert geen variabele, maar gebruikt de instance variabele. De waarde van de variabel wordt eerst getoond, dan vermenigvuldigd met 10 en dan weer getoond. Als de procedure opnieuw wordt opgeroepen behoudt de variabele zijn aangepaste waarde (bvb initieel 1, dan 10,...) Beiden refereren naar de variabele value, maar met een andere scope Visual Basic.NET

27 MethodB gebruikt de instance variabele value, en past zijn waarde aan
' automatic local variable value hides instance variable Sub MethodA() Dim value As Integer = 25 ' initialized after each call 36 lblOutput.Text &= vbCrLf & vbCrLf & "local variable " & _ "value in MethodA is " & value & " after entering MethodA" value += 1 lblOutput.Text &= vbCrLf & "local variable " & _ "value in MethodA is " & value & " before exiting MethodA" End Sub ' MethodA 43 ' uses instance variable value Sub MethodB() lblOutput.Text &= vbCrLf & vbCrLf & "instance variable" & _ " value is " & value & " after entering MethodB" value *= 10 lblOutput.Text &= vbCrLf & "instance variable " & _ "value is " & value & " before exiting MethodB" End Sub ' MethodB 52 53 End Class ' FrmScoping MethodA gebruikt een lokale variabele value. Bij iedere oproep wordt variabele opnieuw gecreëerd en geinitialiseerd op 25. De variabele wordt vernietigd bij beëindigen van de procedureuitvoering MethodB gebruikt de instance variabele value, en past zijn waarde aan Visual Basic.NET

28 4.12 Recursion 5! 5! Final value = 120 5 * 4! 5 * 4! 5! = 5 * 24 = 120 is returned 4 * 3! 4 * 3! 4! = 4 * 6 = 24 is returned 3 * 2! 3 * 2! 3! = 3 * 2 = 6 is returned 2 * 1! 2 * 1! 2! = 2 * 1 = 2 is returned Laat ik over aan de studenten als lectuur. Ga ik niet behandelen. 1 1 1 returned (a) Procession of recursive calls (b) Values returned from each recursive call Visual Basic.NET

29 4.12 Recursie Conversie van String naar Integer 1 ' Factorial.vb
2 ' Calculating factorials using recursion. 3 4 Public Class FrmFactorial Inherits System.Windows.Forms.Form 6 Friend WithEvents lblEnter As Label ' prompts for Integer Friend WithEvents lblFactorial As Label ' indicates output 9 Friend WithEvents txtInput As TextBox ' reads an Integer Friend WithEvents txtDisplay As TextBox ' displays output 12 Friend WithEvents cmdCalculate As Button ' generates output 14 ' Visual Studio .NET generated code 16 Private Sub cmdCalculate_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdCalculate.Click 19 Dim value As Integer = Convert.ToInt32(txtInput.Text) Dim i As Integer Dim output As String 23 txtDisplay.Text = "" 25 For i = 0 To value txtDisplay.Text &= i & "! = " & Factorial(i) & vbCrLf Next 29 End Sub ' cmdCalculate_Click Conversie van String naar Integer Visual Basic.NET

30 31 ' recursively generates factorial of number Function Factorial(ByVal number As Long) As Long 34 If number <= 1 Then ' base case Return 1 Else Return number * Factorial(number - 1) End If 40 End Function ' Factorial 42 43 End Class ' FrmFactorial Als number > 1, roept de procedure zichzelf terug aan, met een eenvoudiger probleem Visual Basic.NET

31 4.13.1 Procedure Overloading
Meerdere procedures met dezelfde naam maar verschillende parameterlijsten (aantal of type) Overloading van procedures die ongeveer dezelfde taken uitvoeren, maakt programma’s leesbaarder. Overloading : Meerdere procedures met dezelfde naam maar verschillende parameterlijsten (aantal of type). Wanneer een overloaded procedure wordt aangeroepen selecteert de compiler de juiste procedure rekening houdend met het aantal parameters, type van de parameters en volgorde. Meestal wordt overloading gebruikt om meerdere procedures te creeeren met dezelfde naam die dezelfde taken uitvoeren maar op andere data types. Overloaded procedures worden van mekaar onderscheiden door hun signatuur (d.I. Naam en parameterlijst). Visual Basic.NET

32 De compilergebruikt bvb de logische naam “Square of Integer”
1 ' Overload.vb 2 ' Using overloaded methods. 3 4 Public Class FrmOverload Inherits System.Windows.Forms.Form 6 Friend WithEvents outputLabel As Label 8 ' Visual Studio .NET generated code 10 Private Sub FrmOverload_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 13 outputLabel.Text = "The square of Integer 7 is " & _ square(7) & vbCrLf & "The square of Double " & _ "7.5 is " & square(7.5) End Sub ' FrmOverload_Load 18 Function Square(ByVal value As Integer) As Integer Return Convert.ToInt32(value ^ 2) End Function ' Square 22 Function Square(ByVal value As Double) As Double Return value ^ 2 End Function ' Square 26 27 End Class ' FrmOverload Event treedt op voordat het formulier voor de eerste keer wordt geopend. De compiler gebruikt een logische naam om een onderscheid te maken tussen de 2 Square methods De compilergebruikt bvb de logische naam “Square of Integer” De compiler gebruikt bvb de logische naam “Square of Double” Als de compiler enkel de namen van de procedures zou bekijken zou je een fout “ambiguous name detected” krijgen. De compiler maakt gebruik van een logisch proces , overload resolution genaamd, om te bepalen welke procedure wordt opgeroepen. Dit proces zoekt eerst alle procedures op die in aanmerking zouden kunnen komen op basis van het aantal en type van argumenten. Dit kunnen er meerdere zijn, want VB promoot variabelen adhv impliciete conversie. Daarna kiest de compiler de procedure die het meest aansluit. Deze matching gebeurt obv een best-fit algoritme, die analyseert welke impliciete conversies nodig zijn. De compiler zou in bovenstaand vb de logische namen Square of double en square of integer kunnen gebruiken. De logische namen gebruikt door de compilers bevatten wel geen return types. Dit is omdat procedure calls niet van mekaar onderscheiden kunnen worden obv return types. Volgende slide genereert een syntax fout dat gegenereerd worden wanneer 2 methodes dezelfde parameterlijst hebben maar een verschillend return type.Overloaded procedures moeten niet hetzelfde return type hebben, zolang het aantal en type van de parameters maar verschilt Visual Basic.NET

33 1 ' Overload2.vb 2 ' Using overloaded procedures with identical signatures and 3 ' different return types. 4 5 Public Class FrmOverload2 Inherits System.Windows.Forms.Form 7 Friend WithEvents outputLabel As Label 9 ' Visual Studio .NET generated code 11 Private Sub FrmOverload2_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 14 outputLabel.Text = "The square of Integer 7 is " & _ square(7) & vbCrLf & "The square of Double " & _ "7.5 is " & square(7.5) End Sub ' FrmOverload2_Load 19 Function Square(ByVal value As Double) As Integer Return Convert.ToInt32(value ^ 2) End Function ' Square 23 Function Square(ByVal value As Double) As Double Return value ^ 2 End Function ' Square 27 28 End Class ' FrmOverload2 Procedure calls kunnen niet onderscheiden worden o.b.v. return type Syntax fout Genereert een syntax fout. De task list wordt getoond als de compiler fout gegenereerd wordt Ipv vbtab gebruik je beter ControlChars.Tab Ipv vbcrlf gebruik je beter ControlChars.NewLine Visual Basic.NET

34 Optionele parameters Argumenten binnen een procedure kunnen als optioneel gedefinieerd worden. Het oproepend programma beslist dan om al dan niet een waarde door te geven. Optionele argumenenten worden worden voorafgegaan door keyword Optional in de procedure header en bevatten een defaultwaarde Voorbeeld Sub ExampleProcedure(ByVal value1 as boolean, Optional _ ByVal value2 As Long = 0) Mogelijke calls : ExampleProcedure(True), ExampleProcedure(False,10) Syntax errors, als je in de procedure header geen default waarde meegeeft voor een optionele parameter. Niet optionele parameters rechts van de optionele parameters definieert Visual Basic.NET

35 Optionele parameters Voorbeeld : machtsverheffing. De gebruiker geeft de base en de exponent op. De exponent is niet verplicht. Als de gebruiker geen waarde ingeeft voor de exponent dan wordt de waarde 2 genomen. Visual Basic.NET

36 4.13.2 Optionele parameters We bekijken eerst de functie Power
36 ' use iteration to calculate power Function Power(ByVal base As Integer, _ Optional ByVal exponent As Integer = 2) As Integer 40 Dim total As Integer = 1 Dim i As Integer 43 For i = 1 To exponent total *= base Next 47 Return total End Function ' Power 50 51 End Class ' FrmPower Als argument niet wordt doorgegeven bij procedure aanroep, defaulteert het Optional argument naar de waarde 2 Je kan evengoed total = base ^exponent gebruiken ipv for lus Visual Basic.NET

37 Bepaalt of txtPower een waarde bevat
1 ' Power.vb 2 ' Calculates the power of a value, defaults to square. 3 4 Public Class FrmPower Inherits System.Windows.Forms.Form 6 Friend WithEvents txtBase As TextBox ' reads base Friend WithEvents txtPower As TextBox ' reads power 9 Friend WithEvents inputGroup As GroupBox 11 Friend WithEvents lblBase As Label ' prompts for base Friend WithEvents lblPower As Label ' prompts for power Friend WithEvents lblOutput As Label ' displays output 15 Friend WithEvents cmdCalculate As Button ' generates output 17 ' Visual Studio .NET generated code 19 ' reads input and displays result Private Sub cmdCalculate_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdCalculate.Click 23 Dim value As Integer 25 ' call version of Power depending on power input If Not txtPower.Text = "" Then value = Power(Convert.ToInt32(txtBase.Text), _ Convert.ToInt32(txtPower.Text)) Else value = Power(Convert.ToInt32(txtBase.Text)) End If 33 lblOutput.Text = Convert.ToString(value) End Sub ' cmdCalculate_Click Bepaalt of txtPower een waarde bevat Visual Basic.NET

38 4.14 Modules Gebruikt voor het groeperen van gerelateerde procedures, zodat ze hergebruikt kunnen worden in andere projecten In veel opzichten gelijk aan klassen Zouden self-contained moeten zijn Toevoegen van module aan project : Project > Add Module Voorbeeld : module groepeert procedures m.b.t. dobbelsteen, voor hergebruik in andere programma’s Programma, met een dobbelsteen, die van de functionaliteit in module gebruik maakt Self-contained betekent dat de procedures in module geen toegang zouden mogen hebben tot variabelen en procedures buiten module Ik zou hier persoonlijk toch opteren voor een klasse dobbelstenen Visual Basic.NET

39 baseImageName = naam beeldje.
1 ' DiceModule.vb 2 ' A collection of common dice procedures. 3 4 Imports System.IO 5 6 Module modDice 7 Dim randomObject As Random = New Random() 9 ' rolls single die Function RollDie() As Integer Return randomObject.Next(1, 7) End Function ' RollDie 14 ' die summation procedure Function RollAndSum(ByVal diceNumber As Integer) _ As Integer 18 Dim i As Integer Dim sum As Integer = 0 21 For i = 1 To diceNumber sum += RollDie() Next 25 Return sum End Function ' RollAndSum 28 ' returns die image Function GetDieImage(ByVal dieValue As Integer, _ Optional ByVal baseImageName As String = "die") _ As System.Drawing.Image 33 Return Image.FromFile(Directory.GetCurrentDirectory & _ "\Images\" & baseImageName & dieValue & ".png") End Function ' GetDieImage 37 End Module ' modDice modDice groupeert verscheidenen dice-related procedures in 1 module, voor hergebruik in andere programma’s. Om module toe te voegen aan Project : Project > Add Module Simuleert het gooien van de dobbelsteen en retourneert een resultaat. FCL Class Random, methode Next genereert random nummer tussen 1 en 6 De dobbelsteen wordt diceNumber maal gegooid en het resultaat van de worpen wordt gesommeerd. Dicemodule : groepeert functies ivm dobbelsteen. Functie RollDie simuleert het gooien van de dobbelsteen en retourneert een resultaat Retourneert Image : dieValue = de worp (het nr die getoond dient te worden op de dobbelsteen) baseImageName = naam beeldje. Visual Basic.NET

40 4.14 Modules GroupBox PictureBox Button Label Visual Basic.NET

41 Gooien van dobbelsteen en tonen van de worp op een beeldje.
1 ' DiceModuleTest.vb 2 ' Demonstrates modDiceModule procedures 3 Imports System.Drawing 4 5 Public Class FrmDiceModuleTest Inherits System.Windows.Forms.Form Friend WithEvents lblSum As Label ' displays 10-roll sum 8 Friend WithEvents diceGroup As GroupBox 9 ' dice images Friend WithEvents picDie1 As PictureBox Friend WithEvents picDie2 As PictureBox Friend WithEvents cmdRollDie1 As Button ' rolls blue die Friend WithEvents cmdRollTen As Button ' simulates 10 rolls Friend WithEvents cmdRollDie2 As Button ' rolls red die ' Visual Studio .NET generated code 16 Private Sub cmdRollDie1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdRollDie1.Click 19 picDie1.Image = modDice.GetDieImage(modDice.RollDie()) End Sub ' cmdRollDie1_Click 22 Private Sub cmdRollDie2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdRollDie2.Click 25 picDie2.Image = modDice.GetDieImage(modDice.RollDie(), "redDie") End Sub ' cmdRollDie2_Click Private Sub cmdRollTen_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdRollTen.Click 30 lblSum.Text = Convert.ToString(modDice.RollAndSum(10)) End Sub ' cmdRollTen_Click 33 34 End Class ' FrmDiceModuleTest Voor het oproepen van een procedure in de module modDice, gebruik je de naam van de module, gevolgd door de dot (.) operator en de naam van de procedure Gooien van dobbelsteen en tonen van de worp op een beeldje. Stelt de Text property van lblSum = resultaat van 10 worpen Visual Basic.NET

42 4.15 Arrays Arrays zijn data structuren bestaande uit data items van hetzelfde type. De gegevens uit een array worden opgeslagen in een aaneengesloten geheugengebied Erven van de klasse Array binnen de Namespace System “Statische” entiteiten : éénmaal gecreëerd behouden ze hun grootte Er wordt naar een element verwezen adhv de index (1ste element heeft index 0) Elke array kent zijn eigen lengte, via de Length property GetLowerBound/GetUpperBound Methode : retourneert index van eerste/laatste element (= Length – 1) van array. Methode heeft als input parameter de dimensie Rank : aantal dimensies in array ( 1-dim.array => rank = 1) Arrays helpen je gegevens te bewaren in een aaneengesloten geheugengebied(Groep van aaneengesloten geheugenlocaties met dezelfde naam, en type), en er wordt naar verwezen adhv hun index, dat is de volgorde waarin de elementen zijn opgeslagen in de array. Het aantal elementen dat een array bevat is de lengte van een array. Alle arrays erven van de klasse System.Array. De klasse Array is een member van de System Namespace en verschaft methoden voor het maken, zoeken, sorteren en wijzigen van arrays. In GetUpperbound wordt gebruikt gemaakt van Dimensie : A zero-based dimension of the Array whose upper bound needs to be determined. Voorbeeld uit Help ' Creates a new one-dimensional Array of type Int32. Dim my1DIntArray As Array = Array.CreateInstance(GetType(Int32), 5) ' Uses GetLowerBound and GetUpperBound in the for loop. Dim i As Integer For i = my1DIntArray.GetLowerBound(0) To my1DIntArray.GetUpperBound(0) my1DIntArray.SetValue(i + 1, i) Next i ‘ Displays the bounds and values of the one-dimensional Array. Console.WriteLine("One-dimensional Array:") Console.WriteLine("Rank" + ControlChars.Tab + "Lower" _ + ControlChars.Tab + "Upper") Console.WriteLine("{0}" + ControlChars.Tab + "{1}" _ + ControlChars.Tab + "{2}", 0, my1DIntArray.GetLowerBound(0), _ my1DIntArray.GetUpperBound(0)) Console.WriteLine("Values:") PrintValues(my1DIntArray) Console.WriteLine() ' Creates a new three-dimensional Array of type Int32. Dim my3DIntArray As Array = Array.CreateInstance(GetType(Int32), 2, 3, 4) Dim j, k As Integer For i = my3DIntArray.GetLowerBound(0) To my3DIntArray.GetUpperBound(0) For j = my3DIntArray.GetLowerBound(1) _ To my3DIntArray.GetUpperBound(1) For k = my3DIntArray.GetLowerBound(2) _ To my3DIntArray.GetUpperBound(2) my3DIntArray.SetValue(i * j * 10 + k, i, j, k) Next k Next j ' Displays the bounds and values of the multidimensional Array. Console.WriteLine("Multidimensional Array:") onsole.WriteLine("Rank" + ControlChars.Tab + "Lower" _ + ControlChars.Tab + "Upper") For i = 0 To my3DIntArray.Rank - 1 Console.WriteLine("{0}" + ControlChars.Tab + "{1}" _ + ControlChars.Tab + "{2}", i, my3DIntArray.GetLowerBound(i), my3DIntArray.GetUpperBound(i)) Console.WriteLine("Values:") PrintValues(my3DIntArray) End Sub Public Shared Sub PrintValues(myArr As Array) Dim myEnumerator As System.Collections.IEnumerator = myArr.GetEnumerator() Dim i As Integer = 0 Dim cols As Integer = myArr.GetLength(myArr.Rank - 1) While myEnumerator.MoveNext() If i < cols Then i += 1 Else Console.WriteLine() i = 1 End If Console.Write(ControlChars.Tab + "{0}", myEnumerator.Current) End While Console.WriteLine() End Class ' This code produces the following output. ' ' One-dimensional Array: ' Rank Lower Upper ' ' Values: ' ' ' Multidimensional Array: ' Rank Lower Upper ' ' ' ' Values: ' ' ' ' ' ' Visual Basic.NET

43 4.15 Arrays Voorbeeld array met 12 elementen
Naam array (alle elementen in de array hebben dezelfde naam) numberArray) numberArray(0) -45 numberArray(1) 6 numberArray(2) numberArray(3) 72 numberArray(4) 1543 numberArray(5) -89 numberArray(6) numberArray(7) 62 numberArray(8) -3 Positie nummer (index of subscript) van element in numberArray numberArray(9) 1 numberArray(10) 6453 numberArray(11) 78 Visual Basic.NET

44 4.15 Arrays Erven van de array klasse in de System Namespace
Declaratie van array (opgeven van type van array) Dim numberArray As Integer() Toewijzen van een object aan een array reference numberArray = New Integer(11) {} Initializer list numberArray = New Integer() {1,2,3,6} Of verkort Dim numberArray As Integer()= New Integer(11) {} of Dim numberArray(11) as Integer of Dim numberArray() as Integer= {1,2,3,6} Memory : The amount of memory required by an array depends on the length of the array and the size of the data type of the elements in the array Declaratie : Bij declaratie geef je het type op van de array en alle elementen van de array moeten van dat type zijn. Als het gegevenstype Object is dan kunnen de individuele elementen van een verschillend type zijn (objects, strings, numbers, ...). Het gegevens type kan van het primitieve datatype zijn, een eigen gedefinieerd data type(structuur) of een object class. In vb declareren we numberArray als een referentie naar een integerarray. De haakjes duiden aan dat het om een array gaat waarnaar gerefereerd wordt. Toewijzen van een object aan een array reference : Instantiatie : creatie van een object (opgeven van grootte van array) Keyword New : Creeert een object. Wordt gebruikt om de grootte vande array mee te geven en de geheugenruimte voor de array te alloceren. Arrays in .NET zijn objecten dus je moet het keyword New gebruiken. De waarde die infeite in de variabele gestopt wordt is een verwijzing, reference, naar het geheugen waar de array zich bevindt. Alle niet-primitive type variabelen zijn referenced variabelen. De 11 betekent de grens van de array. Dus de array kan de elementen 0 t.e.m. 11 bevatten. De actuele grootte is dus 12 Initializer list : Specifieert de initiele waarden van de elementen in de array. Als deze lijst empty dan is de initiele waarde van de elementen de default waarde voor data data type.De default waarden zijn 0 voor de numerische types, false voor boolean en Nothing voor references.I.g.v. initalizer list bepaalt VB zelf de grootte van de array. Het opsplitsen van declaratie en instantiatie is bruikbaar wanneer de grootte van de array van een aantal parameters afhangt Visual Basic.NET

45 1 statement wordt gebruikt om 2 arrays te declareren
1 ' InitArray.vb : Declaration, allocating and Initializing arrays. 2 Imports System.Windows.Forms 3 Module modInitArray 4 Sub Main() Dim output As String Dim i As Integer 8 Dim array1, array2 As Integer() ' declare two arrays 10 ' initializer list specifies number of elements ' and value of each element array1 = New Integer() {32, 27, 64, 18, 95, _ , 90, 70, 60, 37} 15 ' allocate array2 based on length of array1 array2 = New Integer(array1.GetUpperBound(0)) {} 18 ' set values in array2 by a calculation For i = 0 To array2.GetUpperBound(0) array2(i) = * i Next 23 output &= "Subscript " & vbTab & "Array1" & vbTab & _ "Array2" & vbCrLf 26 ' display values for both arrays For i = 0 To array1.GetUpperBound(0) output &= i & vbTab & array1(i) & vbTab & array2(i) & _ vbCrLf Next MessageBox.Show(output, "Array of Integer Values", _ MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub ' Main 35 End Module ' modInitArray 1 statement wordt gebruikt om 2 arrays te declareren Allocatie van 10 elementen in array1 adhv New + initialisatie van elementen adhv initializer list Allocatie array2, grootte = array1.GetUpperBound(0), dus beide hebben dezelfde lengte Initialisatie van elk element in array2 dmv For loop (even integers) Voegt aan output de kolomheadings toe van de tabel die zal getoond worden Creeert 2 integer arrays van 10 elementen en initialiseert de waarden op 3 verschillende manieren Initializer list For loop Gebruikt de waarden in de arrays om de String output op te bouwen en dan te tonen in een MessageBox Visual Basic.NET

46 4.16 Doorgeven van array aan procedure
Specifieer de naam van de array zonder haakjes Elke array “kent” zijn upper bound Je dient de upperbound niet door te geven als een apart argument In Visual Basic, worden arrays altijd by reference doorgegeven Ontvangen van array De procedure’s parameter lijst moet specifiëren dat het om een array gaat Ontvangen van array : je geeft enkel mee dat de procedure een array verwacht (door de ()) van een bepaald type, maar je geeft niet op wat de grootte van de array moet zijn. We zeggen dus aan VB dat het ons niet kan schelen hoe groot de array is, en dat je bijgevolg een array van om het even welke grootte kan doorgeven. Visual Basic.NET

47 4.17 Passing Arrays : ByVal of ByRef
Visual Basic.NET Een variabele die een object “opslaat”, zoals een array, zal het object zelf niet opslaan Maar wel een verwijzing (reference) naar het object Nl de geheugenlocatie waar object reeds is opgeslagen ByVal De waarde van het argument wordt gecopieerd naar de lokale variabele in de procedure Aanpassingen aan de variabele gebeuren op de lokale copy van die variabele, niet op de originele variabele van het oproepend programma Maar als het argument een reference type is, zoals een array, dan zal ByVal eigenlijk ByRef doorgeven, zodat de aanpassingen toch op het origineel object gebeuren. Visual Basic.NET

48 4.17 Passing Arrays : ByVal of ByRef
Igv ByRef krijgt de opgeroepen procedure de controle over de doorgegeven referentie. De opgeroepen procedure kan bijgevolg de verwijzing aanpassen en laten wijzen naar een ander object of zelfs de verwijzing op Nothing zetten. Gebruik ByVal IS operator Test of 2 variabelen naar hetzelfde object wijzen If firstArray Is firstArrayCopy Then Console.WriteLine(vbCrLf & "The references are equal.") Else Console.WriteLine(vbCrLf & "The references are not equal.") End If Visual Basic.NET

49 1 ' ArrayReferenceTest.vb
2 ' Testing the effects of passing array references using 3 ' ByVal and ByRef. 4 5 Module modArrayReferenceTest 6 Sub Main() Dim i As Integer 9 ' declare array references Dim firstArray As Integer() Dim firstArrayCopy As Integer() 13 ' allocate firstArray and copy its reference firstArray = New Integer() {1, 2, 3} firstArrayCopy = firstArray 17 Console.WriteLine("Test passing array reference " & _ "using ByVal.") Console.Write("Contents of firstArray before " & _ "calling FirstDouble: ") 22 ' print contents of firstArray For i = 0 To firstArray.GetUpperBound(0) Console.Write(firstArray(i) & " ") Next 27 ' pass firstArray using ByVal FirstDouble(firstArray) 30 Console.Write(vbCrLf & "Contents of firstArray after " & _ "calling FirstDouble: ") 33 Kopieert verwijzing firstArray naar variabele firstArrayCopy. Ze verwijzen nu beide naar hetzelfde object Print de inhoud van FirstArray; om dan te kunnen tonen dat FirstDouble de inhoud van de array aanpast Dit programma toont verschil tussen ByRef en ByVal. ByRef is gevaarlijk. Lijn 11-1é declareren 2 integer array variabelen Lijn 15 : alloceert een array met integers die de waarden 1,2,3 bevatten en plaatst een verwijzing naar de array in de variabele firstArray Lijn 16 : kopieert de verwijzing naar de array in firstarray naar firstarraycopy. Beide variabelen wijzen dus naar hetzelfde object. Lijn : print de inhoud van firstarray alvorens het wordt doorgegeven aan de procedure FirstDouble op lijn 29 Lijn 29 : array wordt byval doorgegeven. Dus de procedure kan de inhoud van de array aanpassen maar niet laten wijzen naar een ander object of naar nothing Lijn 31 : printen inhoud array na wijziging Visual Basic.NET

50 34 ' print contents of firstArray
For i = 0 To firstArray.GetUpperBound(0) Console.Write(firstArray(i) & " ") Next 38 ' test whether reference was changed by FirstDouble If firstArray Is firstArrayCopy Then Console.WriteLine(vbCrLf & "The references are " & _ "equal.") Else Console.WriteLine(vbCrLf & "The references are " & _ "not equal.") End If 47 ' declare array references Dim secondArray As Integer() Dim secondArrayCopy As Integer() 51 ' allocate secondArray and copy its reference secondArray = New Integer() {1, 2, 3} secondArrayCopy = secondArray 55 Console.WriteLine(vbCrLf & "Test passing array " & _ "reference using ByRef.") Console.Write("Contents of secondArray before " & _ "calling SecondDouble: ") 60 ' print contents of secondArray before procedure call For i = 0 To secondArray.GetUpperBound(0) Console.Write(secondArray(i) & " ") Next 65 ' pass secondArray using ByRef SecondDouble(secondArray) 68 De IS – operator test of firstArray en firstArrayCopy naar hetzelfde object wijzen. Lijn40 : de IS operator vergelijkt reference firstarray en firstarrayCopy. Wat het geval is. Lijnen doen hetzelfde maar nu gebruik makend van secondArray en seconArrayCopy die BYRef worden doorgegeven. Nu wijst de variabele naar een ander object! Visual Basic.NET

51 Elk element van de array wordt met 2 vermenigvuldigd
Console.Write(vbCrLf & "Contents of secondArray " & _ "after calling SecondDouble: ") 71 ' print contents of secondArray after procedure call For i = 0 To secondArray.GetUpperBound(0) Console.Write(secondArray(i) & " ") Next 76 ' test whether the reference was changed by SecondDouble If secondArray Is secondArrayCopy Then Console.WriteLine(vbCrLf & "The references are " & _ "equal.") Else Console.WriteLine(vbCrLf & "The references are " & _ "not equal.") End If 85 End Sub ' Main 87 ' procedure modifies elements of array and assigns ' new reference (note ByVal) Sub FirstDouble(ByVal array As Integer()) Dim i As Integer 92 ' double each element value For i = 0 To array.GetUpperBound(0) array(i) *= 2 Next 97 ' create new reference and assign it to array array = New Integer() {11, 12, 13} End Sub ' FirstDouble 101 Reference ByVal Elk element van de array wordt met 2 vermenigvuldigd Lijn 99 : alloceert een nieuwe array met de waarden 11,12 en 13. De verwijzing naar die nieuwe array wordt dan toegekend aan de variabele array. Alloceert een nieuwe array, slaat de verwijzing naar die array op in de parameter array. Daar ByVal zal firstArray nog steeds naar hetzelfde object wijzen, maar de waarden van de elementen zijn verdubbeld. Visual Basic.NET

52 4.17 Passing Arrays : ByVal of ByRef
' procedure modifies elements of array and assigns ' new reference (note ByRef) Sub SecondDouble(ByRef array As Integer()) Dim i As Integer 106 ' double contents of array For i = 0 To array.GetUpperBound(0) array(i) *= 2 Next 111 ' create new reference and assign it to array array = New Integer() {11, 12, 13} End Sub ' SecondDouble 115 116 End Module ' modPassArray Reference is passed ByRef Daar ByRef, kan de procedure de variabele naar een ander object laten wijzen Test passing array reference using ByVal. Contents of firstArray before calling FirstDouble: 1 2 3 Contents of firstArray after calling FirstDouble: 2 4 6 The references are equal. Test passing array reference using ByRef. Contents of secondArray before calling SecondDouble: 1 2 3 Contents of secondArray after calling SecondDouble: The references are not equal. Visual Basic.NET

53 4.18 Multidimensionele Arrays
Multidimensional arrays (multiple-subscripted) Vereisen minimum 2 indexen om een element te identificeren. De dimensie van een array = het aantal indexen nodig om een element te identificeren Rectangular arrays : 2 dimensionele arrays Dim numbers As Integer(,) = New Integer(,){{1,2},{3,4}} Of Dim numbers As Integer(,) = New Integer(1,1){} numbers(0,0) = 1 numbers(0,1) = 2 numbers(1,0) = 3 numbers(1,1) = 4 In een 1 dimensionele array sla je bvb de namen van de werknemers op. Maar misschien wil je gerelateerde gegevens ook opslaan zoals werknemerscode en bijhorend salaris. In dat geval moet je gebruik maken van multidimensionele arrays Numbers is een 2 dimensionele array met 2 rijen en 2 kolommen. Kan op 2 manieren gedeclareerd, gealloceerd worden Visual Basic.NET

54 4.18 Multidimensionele Arrays
Dim a As Integer(,) = New Integer(2,3){ } Column 0 Column 1 Column 2 Column 3 Row 0 a(0, 0) a(0, 1) a(0, 2) a(0, 3) Row 1 a(1, 0) a(1, 1) a(1, 2) a(1, 3) Row 2 a(2, 0) a(2, 1) a(2, 2) a(2, 3) Column index Row index (or subscript) 2 dimensionele array a. A(i,j) identificeert een element uit de array. 0-based. Array name Visual Basic.NET

55 4.18 Multidimensionele Arrays
Jagged arrays Een array die andere arrays als elementen bevat Rijen in jagged arrays kunnen van verschillende lengte zijn Dim jaggedArray As Integer()() jaggedArray = New Integer(1) () {} jaggedArray(0) = New Integer(){1,2} jaggedArray(1) = New Integer()[3,4,5} Doorlopen van jagged array Dim total, row, column as Integer For row = 0 to jaggedArray.GetUpperBound(0) For column = 0 to jaggedArray(row).GetUpperBound(0) total += jaggedArray (row) (column) Next Array2 is een integer array met rij 0 (die zelf een array is) bevat 2 elementen 1 en 2 en rij 1 bevat 3 elementen. Aan array2(0) kan een 1 dimensionele array toegewezen worden. Visual Basic.NET

56 Alloceert array1 met initializers lijsten
' MultidimensionalArrays.vb : ' Initializing multi-dimensional arrays. Imports System.Windows.Forms Module modMultidimensionalArrays Sub Main() Dim output As String Dim i, j As Integer ' create rectangular two-dimensional array Dim array1 As Integer(,) array1 = New Integer(,) {{1, 2, 3}, {4, 5, 6}} ' create jagged two-dimensional array Dim array2 As Integer()() = New Integer(2)() {} array2(0) = New Integer() {1, 2} array2(1) = New Integer() {3} array2(2) = New Integer() {4, 5, 6} output = "Values in array1 by row are " & vbCrLf For i = 0 To array1.GetUpperBound(0) For j = 0 To array1.GetUpperBound(1) output &= array1(i, j) & " " Next output &= vbCrLf output &= vbCrLf & "Values in array2 by row are " & vbCrLf For i = 0 To array2.GetUpperBound(0) For j = 0 To array2(i).GetUpperBound(0) output &= array2(i)(j) & " " MessageBox.Show(output, "Initializing Multi-Dimensional Arrays", _ MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub ' Main End Module ' modMultidimensionalArrays Alloceert array1 met initializers lijsten Declaratie en allocatie van jagged array array2 bestaande uit 3 arrays Doorloopt 2 dimensionele array In een jagged 2dimensionele array is de 2de dimensie eigenlijk de eerste dimensie van een andere array Demo van een 2 dimensionele tabel(array1) en jagged tabel array2.. Lijn : toont de elementen van array1 (voegt toe aan string output). De geneste for loop doorloopt de 2 dimensies van de array. GetUpperbound(0) vraagt hat aantal rijen op? Getupperbound(1) vraagt het aantal kolommen op. Lijn : de 1ste for/next vraagt het aantal rijen op. De 2de for/next bepaalt het aantal kolommen in elke rij van de arraydoor argument 0 door te geven aan GetUpperBound.Deze methode wordt opgeroepen op een 1 dimensionele array (array2(i)). Arrays met meer dan 2 dimensies : 1 for/next per dimensie Visual Basic.NET

57 4.19 For Each/Next herhalingsstructuur
Gebruikt om een reeks statements te herhalen voor elk element in de data structuur, zoals een array. Ipv een teller gebruikt For Each/Next een variabele die de waarde van elk element voorstelt Visual Basic.NET

58 4.19 For Each/Next herhalingsstructuur
1 ' ForEach.vb 2 ' Program uses For Each/Next to find a minimum grade. 3 4 Module modForEach 5 Sub Main() Dim gradeArray As Integer(,) = New Integer(,) _ {{77, 68, 86, 73}, {98, 87, 89, 81}, {70, 90, 86, 81}} 9 Dim grade As Integer Dim lowGrade As Integer = 100 12 For Each grade In gradeArray 14 If grade < lowGrade Then lowGrade = grade End If 18 Next 20 Console.WriteLine("The minimum grade is: {0}", lowGrade) End Sub ' Main 23 24 End Module ' modForEach Deze structuur doorloopt sequentieel alle elementen in de array gradeArray, en kent telkens de waarde van het element toe aan de vraiabele grade De waarde van het element wordt vergeleken met lowGrade, die de kleinste graad bijhoudt uit de array. The minimum grade is: 68 Visual Basic.NET

59 Oefening Flag Quiz Visual Basic.NET

60 Oefening Gegeven een 3 dimensionele jagged array met examenscores
Dim gradeArray As Integer()() = New Integer(2)() {} ' allocateert elke rij met punten van 4 studenten gradeArray(0) = New Integer() {77, 68, 86, 73} gradeArray(1) = New Integer() {98, 87, 89, 81} gradeArray(2) = New Integer() {70, 90, 86, 81} Genereer onderstaande output Imports System.Windows.Forms 5 6 Module modJaggedArray Dim lastStudent, lastExam As Integer Dim output As String 9 Sub Main() Dim i As Integer 12 ' jagged array with 3 rows of exam scores Dim gradeArray As Integer()() = New Integer(2)() {} 15 ' allocate each row with 4 student grades gradeArray(0) = New Integer() {77, 68, 86, 73} gradeArray(1) = New Integer() {98, 87, 89, 81} gradeArray(2) = New Integer() {70, 90, 86, 81} 20 ' upper bounds for array manipulations lastStudent = gradeArray.GetUpperBound(0) lastExam = gradeArray(0).GetUpperBound(0) 24 output = "Students \ Exams" & vbCrLf 26 ' build output string BuildString(gradeArray) output &= vbCrLf & vbCrLf & "Lowest grade: " & _ Minimum(gradeArray) & vbCrLf & "Highest grade: " & _ Maximum(gradeArray) & vbCrLf ' calculate each student's average For i = 0 To lastStudent output &= vbCrLf & "Average for student " & _ i & " is " & Average(gradeArray(i)) Next 38 MessageBox.Show(output, "Jagged two-dimensional array", _ MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub ' Main 42 ' find minimum grade Function Minimum(ByVal grades As Integer()()) _ As Integer 46 Dim lowGrade As Integer = 100 Dim i, j As Integer 49 For i = 0 To lastStudent 51 For j = 0 To lastExam 53 If grades(i)(j) < lowGrade Then lowGrade = grades(i)(j) End If 57 Next 59 Next 61 Return lowGrade End Function ' Minimum 64 ' find the maximum grade Function Maximum(ByVal grades As Integer()()) _ As Integer 68 Dim highGrade As Integer = 0 Dim i, j As Integer 71 For i = 0 To lastStudent 73 For j = 0 To lastExam 75 If grades(i)(j) > highGrade Then highGrade = grades(i)(j) End If 79 Next 81 Next 83 Return highGrade End Function ' Maximum 86 ' determine the average grade for student ' (or set of grades) Function Average(ByVal setOfGrades As Integer()) _ As Double 91 Dim i As Integer, total As Integer = 0 93 ' find sum of student's grades For i = 0 To lastExam total += setOfGrades(i) Next 98 Return total / setOfGrades.Length End Function ' Average 101 ' creates String displaying array Sub BuildString(ByVal grades As Integer()()) Dim i, j As Integer 105 ' align column heads output &= " " 108 For i = 0 To lastExam output &= "(" & i & ") " Next 112 For i = 0 To lastStudent output &= vbCrLf & " (" & i & ") " 115 For j = 0 To lastExam output &= grades(i)(j) & " " Next 119 Next 121 End Sub ' BuildString 123 124 End Module ' modJaggedArray Visual Basic.NET

61 Alle icoontjes A key feature of the .NET Framework is the base class library. For more information about the common language runtime, the class library, the common language specification (CLS), and other features of the .NET Framework, see Inside the .NET Framework. Namespaces The .NET Framework class library is comprised of namespaces. Each namespace contains types that you can use in your program: classes, structures, enumerations, delegates, and interfaces. For an overview of the namespaces, see Class Library. Namespaces provide scope: Two classes with the same name can be used in your program as long as they are in different namespaces and as long as you qualify the names to the namespaces. The namespace name is part of the fully qualified name of the type (namespace.typename). All namespaces shipped by Microsoft begin with one of two names: System or Microsoft. Managed DLLs (Assemblies) The functionality of the .NET Framework class library is not contained in a single DLL. By putting the functionality of the base classes in multiple DLLs, a managed program does not need to load, at start up, a large DLL, but, rather, one or more smaller DLLs. This reduces the startup time for a program. You can use namespaces that are defined in your project. However, you will commonly use types in namespaces that reside in a managed DLL. A managed DLL is also called an assembly. When you create a Visual Basic or Visual C# project in Visual Studio, the most common base class DLLs (assemblies) are already referenced. However, if you need to use a type that is in a DLL not already referenced, you will need to add a reference to the DLL. The Add Reference dialog box allows you to add an assembly. Namespaces and Assemblies: Usage Summary The following is a summary of how you will commonly use managed DLLs (assemblies), namespaces, and the types in the namespaces: Locate a class that provides the functionality you need. For more information, see .NET Framework Class Library in Visual Studio and Common Tasks in Visual Basic and Visual C#. In the documentation overview of the type, note the name of the type's assembly and namespace. See if the assembly is already referenced in your project. Open Solution Explorer and look under the References node. If you do not see an assembly reference, right-click the References node and select Add Reference. For more information, see Adding and Removing References. After you have an assembly reference, you can access the types in the assembly. Tip   If you do not want to use fully qualified names (namespace.typename), you can use the Imports statement in Visual Basic or the using keyword in Visual C#. The following example shows how Visual Basic and Visual C# implicitly use the namespace (and in Visual Basic, the class) qualifier: ' Visual Basic ' TestImports.vb Imports System.Console Module Module1 Sub Main() WriteLine("Hello") ' Without the Imports statement, you would have to use ' System.Console.WriteLine("Hello"). End Sub End Module // C# // TestUsing.cs using System; class MyClass { public static void Main() { Console.WriteLine("Hello"); // Without the using statement, you would have to use // System.Console.WriteLine("Hello"); } } You can put this code into a file, called test.vb or test.cs, and compile it at the command line by typing vbc TestImports.vb or csc TestUsing.cs. You do not have to explicitly reference the mscorlib.dll, which is the assembly that contains the System namespace; the Visual Basic or Visual C# compiler always references mscorlib.dll. Visual Basic.NET

62 Klassen diagramma eerste oefening
Visual Basic.NET

63 Sequence diagramma eerste oefening
Visual Basic.NET

64 4.9 By-Value en By-Reference
1 ByRefTest.vb 2 ' Demonstrates passing by reference. 3 4 Module modByRefTest 5 ' squares three values ByVal and ByRef, displays results Sub Main() Dim number1 As Integer = 2 9 Console.WriteLine("Passing a value-type argument by value:") Console.WriteLine("Before calling SquareByValue, " & _ "number1 is {0}", number1) SquareByValue(number1) ' passes number1 by value Console.WriteLine("After returning from SquareByValue, " & _ "number1 is {0}" & vbCrLf, number1) 16 Dim number2 As Integer = 2 18 Console.WriteLine("Passing a value-type argument" & _ " by reference:") Console.WriteLine("Before calling SquareByReference, " & _ "number2 is {0}", number2) SquareByReference(number2) ' passes number2 by reference Console.WriteLine("After returning from " & _ "SquareByReference, number2 is {0}" & vbCrLf, number2) 26 Dim number3 As Integer = 2 28 Een copie van de waarde wordt doorgegeven aan de procedure Een verwijzing naar de waarde wordt doorgegeven Programma geeft 3 waarden door - 1 by val => Na uitvoering procedure bevat number nog steeds dezelfde waarde - 1 by ref => na uitvoering procedure is de waarde van variabele number aangepast - 1 waarvan argument tussen haakjes (dus toch byref) Visual Basic.NET

65 4.9 By-Value en By-Reference
Console.WriteLine("Passing a value-type argument" & _ " by reference, but in parentheses:") Console.WriteLine("Before calling SquareByReference " & _ "using parentheses, number3 is {0}", number3) SquareByReference((number3)) ' passes number3 by value Console.WriteLine("After returning from " & _ "SquareByReference, number3 is {0}", number3) 36 End Sub ' Main 38 ' squares number by value (note ByVal keyword) Sub SquareByValue(ByVal number As Integer) Console.WriteLine("After entering SquareByValue, " & _ "number is {0}", number) number *= number Console.WriteLine("Before exiting SquareByValue, " & _ "number is {0}", number) End Sub ' SquareByValue 47 ' squares number by reference (note ByRef keyword) Sub SquareByReference(ByRef number As Integer) Console.WriteLine("After entering SquareByReference" & _ ", number is {0}", number) number *= number Console.WriteLine("Before exiting SquareByReference" & _ ", number is {0}", number) End Sub ' SquareByReference 56 57 End Module ' modByRefTest Het plaatsen van het argument tussen haakjes dwing pass-by-value af Bij ByVal wordt een copie van de waarde doorgegeven ByRef geeft directe toegang tot de waarde in de originele variabele Visual Basic.NET

66 4.9 By-Value en By-Reference
Passing a value-type argument by value: Before calling SquareByValue, number1 is 2 After entering SquareByValue, number is 2 Before exiting SquareByValue, number is 4 After returning from SquareByValue, number1 is 2 Passing a value-type argument by reference: Before calling SquareByReference, number2 is 2 After entering SquareByReference, number is 2 Before exiting SquareByReference, number is 4 After returning from SquareByReference, number2 is 4 Passing a value-type argument by reference, but in parentheses: Before calling SquareByReference using parentheses, number3 is 2 After returning from SquareByReference, number3 is 2 Visual Basic.NET

67 Oefening 1 GroupBox PictureBoxes (displaying images)
' Fig 6.17: CrapsGame.vb 2 ' Playing a craps game. 3 4 Imports System.IO 5 6 Public Class FrmCrapsGame Inherits System.Windows.Forms.Form 8 Friend WithEvents cmdRoll As Button ' rolls dice Friend WithEvents cmdPlay As Button ' starts new game 11 ' dice displayed after each roll Friend WithEvents picDie1 As PictureBox Friend WithEvents picDie2 As PictureBox 15 ' pointDiceGroup groups dice representing player's point Friend WithEvents pointDiceGroup As GroupBox Friend WithEvents picPointDie1 As PictureBox Friend WithEvents picPointDie2 As PictureBox 20 Friend WithEvents lblStatus As Label 22 ' Visual Studio .NET generated code 24 ' die-roll constants Enum DiceNames SNAKE_EYES = 2 TREY = 3 CRAPS = 7 YO_LEVEN = 11 BOX_CARS = 12 End Enum 33 ' file-name and directory constants Const FILE_PREFIX As String = "/images/die" Const FILE_SUFFIX As String = ".png" 37 Dim myPoint As Integer Dim myDie1 As Integer Dim myDie2 As Integer Dim randomObject As Random = New Random() 42 ' begins new game and determines point Private Sub cmdPlay_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdPlay.Click 46 ' initialize variables for new game myPoint = 0 pointDiceGroup.Text = "Point" lblStatus.Text = "" 51 ' remove point-die images picPointDie1.Image = Nothing picPointDie2.Image = Nothing 55 Dim sum As Integer = RollDice() 57 ' check die roll Select Case sum 60 Case DiceNames.CRAPS, DiceNames.YO_LEVEN 62 ' disable roll button cmdRoll.Enabled = False lblStatus.Text = "You Win!!!" 66 Case DiceNames.SNAKE_EYES, _ DiceNames.TREY, DiceNames.BOX_CARS 69 cmdRoll.Enabled = False lblStatus.Text = "Sorry. You Lose." 72 Case Else myPoint = sum pointDiceGroup.Text = "Point is " & sum lblStatus.Text = "Roll Again!" DisplayDie(picPointDie1, myDie1) DisplayDie(picPointDie2, myDie2) cmdPlay.Enabled = False cmdRoll.Enabled = True 81 End Select 83 End Sub ' cmdPlay_Click 85 ' determines outcome of next roll Private Sub cmdRoll_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdRoll.Click 89 Dim sum As Integer = RollDice() 91 ' check outcome of roll If sum = myPoint Then lblStatus.Text = "You Win!!!" cmdRoll.Enabled = False cmdPlay.Enabled = True ElseIf sum = DiceNames.CRAPS Then lblStatus.Text = "Sorry. You Lose." cmdRoll.Enabled = False cmdPlay.Enabled = True End If 102 End Sub ' cmdRoll_Click 104 ' display die image Sub DisplayDie(ByVal picDie As PictureBox, _ ByVal face As Integer) 108 ' assign die image to picture box picDie.Image = _ Image.FromFile(Directory.GetCurrentDirectory & _ FILE_PREFIX & face & FILE_SUFFIX) End Sub ' DisplayDie 114 ' generate random die rolls Function RollDice() As Integer Dim die1, die2 As Integer 118 ' determine random integer die1 = randomObject.Next(1, 7) die2 = randomObject.Next(1, 7) 122 ' display rolls DisplayDie(picDie1, die1) DisplayDie(picDie2, die2) 126 ' set values myDie1 = die1 myDie2 = die2 130 Return die1 + die2 End Function ' RollDice 133 134 End Class ' FrmCrapsGame Visual Basic.NET

68 De length property retourneert aantal elementen in array
4.15 Arrays Voorbeeld : delaratie en allocatie van geheugen 1 ' CreateArray.vb 2 ' Declaring and allocating an array. 3 4 Imports System.Windows.Forms 5 6 Module modCreateArray 7 Sub Main() Dim output As String Dim i As Integer 11 Dim array As Integer() ' declare array variable array = New Integer(9) {} ' allocate memory for array 14 output &= "Subscript " & vbTab & "Value" & vbCrLf 16 ' display values in array For i = 0 To array.GetUpperBound(0) output &= i & vbTab & array(i) & vbCrLf Next 21 output &= vbCrLf & "The array contains " & _ array.Length & " elements." 24 MessageBox.Show(output, "Array of Integer Values", _ MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub ' Main 28 End Module ' modCreateArray Een variabel die een reference kan opslaan naar een array van Integer elementen Alloceert geheugen voor een array van 10 elementen gebruik makend van New en kent dit toe aan array Voegt aan output de kolomheadings toe van de tabel die zal getoond worden For structuur voegt index en waarde van elk array element toe aan de variabele output De length property retourneert aantal elementen in array Visual Basic.NET

69 Oefening 2 Visual Basic.NET

70 4.16 Doorgeven van array aan procedure
1 ' PassArray.vb 2 ' Passing arrays and individual array elements to procedures. 3 4 Imports System.Windows.Forms 5 6 Module modPassArray Dim output As String 8 Sub Main() Dim array1 As Integer() = New Integer() {1, 2, 3, 4, 5} Dim i As Integer 12 output = "EFFECTS OF PASSING ENTIRE ARRAY " & _ "BY REFERENCE:" & vbCrLf & vbCrLf & _ "The values of the original array are:" & vbCrLf 16 ' display original elements of array1 For i = 0 To array1.GetUpperBound(0) output &= " " & array1(i) Next 21 ModifyArray(array1) ' array is passed by reference 23 output &= vbCrLf & _ "The values of the modified array are:" & vbCrLf 26 ' display modified elements of array1 For i = 0 To array1.GetUpperBound(0) output &= " " & array1(i) Next 31 Voegt de 5 elementen van array1 toe aan de String output Geeft array1 door aan de procedure ModifyArray via ByRef Voegt de 5 elementen van array1 toe aan de String output Visual Basic.NET

71 Vermenigvuldigd de elementen van arrayParameter met 2
output &= vbCrLf & vbCrLf & _ "EFFECTS OF PASSING ARRAY ELEMENT " & _ "BY VALUE:" & vbCrLf & vbCrLf & "array1(3) " & _ "before ModifyElementByVal: " & array1(3) 36 ' array element passed by value ModifyElementByVal(array1(3)) 39 output &= vbCrLf & "array1(3) after " & _ "ModifyElementByVal: " & array1(3) 42 output &= vbCrLf & vbCrLf & "EFFECTS OF PASSING " & _ "ARRAY ELEMENT BY REFERENCE: " & vbCrLf & vbCrLf & _ "array1(3) before ModifyElementByRef: " & array1(3) 46 ' array element passed by reference ModifyElementByRef(array1(3)) 49 output &= vbCrLf & "array1(3) after " & _ "ModifyElementByRef: " & array1(3) 52 MessageBox.Show(output, "Passing Arrays", _ MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub ' Main 56 ' procedure modifies array it receives (note ByVal) Sub ModifyArray(ByVal arrayParameter As Integer()) Dim j As Integer 60 For j = 0 To arrayParameter.GetUpperBound(0) arrayParameter(j) *= 2 Next 64 End Sub ' ModifyArray 66 Vermenigvuldigd de elementen van arrayParameter met 2 Visual Basic.NET

72 Vermenigvuldigd een elementen met 2 - Byval
' procedure modifies integer passed to it ' original is not be modified (note ByVal) Sub ModifyElementByVal(ByVal element As Integer) 70 output &= vbCrLf & "Value received in " & _ "ModifyElementByVal: " & element element *= 2 output &= vbCrLf & "Value calculated in " & _ "ModifyElementByVal: " & element End Sub ' ModifyElementByVal 77 ' procedure modifies integer passed to it ' original is be modified (note ByRef) Sub ModifyElementByRef(ByRef element As Integer) 81 output &= vbCrLf & "Value received in " & _ "ModifyElementByRef: " & element element *= 2 output &= vbCrLf & "Value calculated in " & _ "ModifyElementByRef: " & element End Sub ' ModifyElementByRef 88 89 End Module ' modPassArray Vermenigvuldigd een elementen met 2 - Byval Vermenigvuldigd een elementen met 2 - ByRef Visual Basic.NET


Download ppt "Hoofdstuk 4 - Procedures en arrays"

Verwante presentaties


Ads door Google