Hoofdstuk 4 - Procedures en arrays

Slides:



Advertisements
Verwante presentaties
KWALITEITSZORG november 2012
Advertisements

Wat was toen het grootste het grootste probleem van de van de FOD?
KINN 2010 •OOP •O Object •O Georiënteerd •P Programmeren.
Presentatie cliëntenonderzoek. Algemeen Gehouden in december 2013 (doorlopend tot eind januari) DoelgroepVerzondenOntvangen% LG wonen en dagbesteding.
Zelf objecten maken in VBA Ynte Jan Kuindersma, BIRD Automation Nationale Officedag 2009 EDE, 14 Oktober 2009.
NEDERLANDS WOORD BEELD IN & IN Klik met de muis
1 Resultaten marktonderzoek RPM Zeist, 16 januari 2002 Door: Olga van Veenendaal, medew. Rothkrans Projectmanagement.
November 2013 Opinieonderzoek Vlaanderen – oktober 2013 Opiniepeiling Vlaanderen uitgevoerd op het iVOXpanel.
Uitgaven aan zorg per financieringsbron / /Hoofdstuk 2 Zorg in perspectief /pagina 1.
Duurzaamheid en kosten
SAP ABAP A short introduction. SAP ABAP • Selectie: – IF …… ENDIF. – IF …. ELSE … ENDIF. – IF …. ELSEIF …. ELSEIF …. ELSE …. ENDIF. – IF condition_1.
Global e-Society Complex België - Regio Vlaanderen e-Regio Provincie Limburg Stad Hasselt Percelen.
Confidential & Proprietary Copyright © 2007 The Nielsen Company INNOVATIE Tracking Februari 2007.
Ronde (Sport & Spel) Quiz Night !
Copyright © 2008 Tele Atlas. All rights reserved. Zet uw Business Data op de kaart: Locaties in eTOM ®
Programmeren in Java met BlueJ
Een optimale benutting van vierkante meters Breda, 6 juni 2007.
OOS Object geOrienteerd Software-ontwerp - 4 Codeerperikelen Singleton Specificeren Scheiding GUI en Domein Facade.
AAHA (voor intern gebruik)
Omgevingen zijn dan geïmplementeerd als Symbol Tables. Symbol Table mapt een symbool met een Binding Meerdere noties van binding –Meerdere manieren te.
Nooit meer onnodig groen? Luuk Misdom, IT&T
Hoofdstuk 6: Controle structuren
Programming for Linguists An Introduction to Python 29/11/2012.
FOD VOLKSGEZONDHEID, VEILIGHEID VAN DE VOEDSELKETEN EN LEEFMILIEU 1 Kwaliteit en Patiëntveiligheid in de Belgische ziekenhuizen anno 2008 Rapportage over.
Elke 7 seconden een nieuw getal
Les 2 Basisbouwstenen (deel 1)
1 introductie 3'46” …………… normaal hart hond 1'41” ……..
Oefeningen F-toetsen ANOVA.
Wat levert de tweede pensioenpijler op voor het personeelslid? 1 Enkele simulaties op basis van de weddeschaal B1-B3.
GESPRG Les 8 Gestructureerd programmeren in C. 101 Array Meerdere variabelen van hetzelfde type kun je samennemen in één array variabele. Stel in een.
In dit vakje zie je hoeveel je moet betalen. Uit de volgende drie vakjes kan je dan kiezen. Er is er telkens maar eentje juist. Ken je het juiste antwoord,
Hoorcollege 8 Game object structuren. Arrays in games Grid-gebaseerd speelveld (zoals Tetris) Lijst van spelers Lijst van inventory items Lijst van alle.
Hoorcollege 7 Collections, arrays. Programma ‘Snowflakes’ Sneeuwvlok object.
Foto 65 – wegenis + parking + rechts G01 Foto 66 – G01.
Seminarie 1: Pythagoreïsche drietallen
Visual Basic.
ALBRECHT DÜRER'S MAGIC SQUARE ALBRECHT DÜRERS MAGISCH VIERKANT
Ben Bruidegom 1 Sequentiële schakelingen Toestand uitgang bepaald door:  ingangen;  vorige toestand uitgang.
1 Van Harvard naar MIPS. 2 3 Van Harvard naar MIPS Microprocessor without Interlocked Pipeline Stages Verschillen met de Harvard machine: - 32 Registers.
ribwis1 Toegepaste wiskunde – Differentieren Lesweek 7
Inger Plaisier Marjolein Broese van Groenou Saskia Keuzenkamp
DB&SQL8- 1 VBA Visual Basics for Applications: eigen Office versie vanaf Office2000 gelijk voor alle applicaties Programmeren onder meer nodig voor Het.
Tussentoets Digitale Techniek. 1 november 2001, 11:00 tot 13:00 uur. Opmerkingen: 1. Als u een gemiddeld huiswerkcijfer hebt gehaald van zes (6) of hoger,
Help! ‘Niet vorderende ontsluiting’
JAVA1 H 22. COLLECTIONS FRAMEWORK. 1. INLEIDING. Collections framework Is een verzameling van data structuren, interfaces en algoritmen Meest voorkomende.
Hoofdstuk 5 – Object Based Programmeren
HOOFDSTUK 7 ARRAYS 7.1.     INLEIDING Array
Hoofdstuk 3: Inleiding tot Java Applets
Hoofdstuk 2 - Inleiding tot Visual Studio .NET IDE
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology ; PIC assember programeren 1 Les 3 - onderwerpen Het.
KPRES1 : C vervolg Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology Les 2 sheet 1 Wat gaan we doen:  Een (vaste) melodie.
2PROJ5 – PIC assembler Hogeschool Utrecht / Institute for Computer, Communication and Media Technology 1 Les 3 - onderwerpen Instruction timing Shadow.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag GUI  command line redirection.
EFS Seminar Discriminatie van pensioen- en beleggingsfondsen
Hoe gaat dit spel te werk?! Klik op het antwoord dat juist is. Klik op de pijl om door te gaan!
Eerst even wat uitleg. Klik op het juiste antwoord als je het weet.
Op reis naar een dierentuin
Web Applicaties Bouwen met Visual Studio .NET
TOPIC O: Pointers | pag. 1 Pointer = adres in het geheugen, is zelf geen geheugen! Expliciet geheugen aanvragen vóór gebruik.
Uitleg scheikundige begrippen
STIMULANS KWALITEITSZORG juni 2014.
Hoofdstuk 5 Interactie. Controls Form Label Button Label TextBox.
C++ C++ als een verbetering van C Abstracte datatypen met classes Constructoren en destructoren Subklassen binding van functies 1.
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 C programmeren voor niet-C programmeurs les 2 definitie.
DIGITAL ANALYTICS TOOLS. 2 DIGITALE MEDIA - METEN.
Openbaar je talent Service public, talent particulier.
Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving
Hoofdstuk 3 - Conditionele logica
Polymorfie Hoofdstuk 24. Visual Basic.NET voor studenten2 Inleiding Polymorfie zorgt ervoor dat een gegeven object verschillende “vormen” kan aannemen.
Transcript van de presentatie:

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

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

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.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 6 Sub Main() 7 PrintPay ontvangt de waarden van elk argument en plaatst deze in de parameter variabelen hours en wage 8 ' call Sub procedure PrintPay 4 times 9 PrintPay(40, 10.5) 10 PrintPay(38, 21.75) 11 PrintPay(20, 13) 12 PrintPay(50, 14) 13 14 Console.ReadLine() ' prevent window from closing PrintPay wordt uitgevoerd, wanneer het aangeroepen wordt in de Main 15 End Sub ' Main 16 17 ' print amount of money earned in command window 18 Sub PrintPay(ByVal hours As Double, ByVal wage As Decimal) 19 20 ' pay = hours * wage 21 Console.WriteLine("The payment is {0:C}", hours * wage) 22 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 17-21 : 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

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

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

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

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

4.4 Function Procedure Voorbeeld : berekenen machtsverheffing 1 ' SquareInteger.vb 2 ' Function procedure to square a number. 3 4 Module modSquareInteger 5 6 Sub Main() Number Square   1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100 7 Dim i As Integer ' counter 8 9 Console.WriteLine("Number" & vbTab & "Square" & vbCrLf) 10 11 ' square numbers from 1 to 10 12 For i = 1 To 10 13 Console.WriteLine(i & vbTab & Square(i)) 14 Next 15 16 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 18 ' Function Square is executed 19 ' only when the function is explicitly called. 20 Function Square(ByVal y As Integer) As Integer 21 Return y ^ 2 22 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

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

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 5 Inherits System.Windows.Forms.Form 6 7 ' prompts for three inputs 8 Friend WithEvents lblOne As System.Windows.Forms.Label 9 Friend WithEvents lblTwo As System.Windows.Forms.Label 10 Friend WithEvents lblThree As System.Windows.Forms.Label 11 12 ' displays result 13 Friend WithEvents lblMaximum As System.Windows.Forms.Label 14 15 ' read three numbers 16 Friend WithEvents txtFirst As System.Windows.Forms.TextBox 17 Friend WithEvents txtSecond As System.Windows.Forms.TextBox 18 Friend WithEvents txtThird As System.Windows.Forms.TextBox 19 20 ' reads inputs and calculate results 21 Friend WithEvents cmdMaximum As System.Windows.Forms.Button 22 23 ' 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

4.5 Methods Event handler cmdMaximum_Click Handelt de gebeurtenis “muisklik op Button cmdMaximum” af 4.5 Methods 25 ' obtain values in each text box, call procedure Maximum 26 Private Sub cmdMaximum_Click(ByVal sender As System.Object, _ 27 ByVal e As System.EventArgs) Handles cmdMaximum.Click 29 Dim value1, value2, value3 As Double 30 31 value1 = txtFirst.Text 32 value2 = txtSecond.Text 33 value3 = txtThird.Text 34 35 lblMaximum.Text = Maximum(value1, value2, value3) 36 End Sub ' cmdMaximum_Click 37 38 ' find maximum of three parameter values 39 Function Maximum(ByVal valueOne As Double, _ 40 ByVal valueTwo As Double, ByVal valueThree As Double) 41 42 Return Math.Max(Math.Max(valueOne, valueTwo), valueThree) 43 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

Addendum : De Math klasse Visual Basic.NET

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-32768 tot +32767. Een unsigned single : 0 tot 65535. 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,3333... 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 = 1234.567; 7,655432E-8 = 0,0000000765432 Visual Basic.NET

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

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

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

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

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 10 5 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

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

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

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

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

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

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

1 ' Scoping.vb 2 ' Demonstrates scope rules and instance variables. 3 4 Public Class FrmScoping 5 Inherits System.Windows.Forms.Form 6 7 Friend WithEvents lblOutput As System.Windows.Forms.Label 8 9 ' Windows Form Designer generated code 10 11 ' instance variable can be used anywhere in class 12 Dim value As Integer = 1 13 14 ' demonstrates class scope and block scope 15 Private Sub FrmScoping_Load(ByVal sender As System.Object, _ 16 ByVal e As System.EventArgs) Handles MyBase.Load 17 18 ' variable local to FrmScoping_Load hides instance variable 19 Dim value As Integer = 5 20 21 lblOutput.Text = "local variable value in" & _ 22 " FrmScoping_Load is " & value 23 24 MethodA() ' MethodA has automatic local value 25 MethodB() ' MethodB uses instance variable value 26 MethodA() ' MethodA creates new automatic local value 27 MethodB() ' instance variable value retains its value 28 29 lblOutput.Text &= vbCrLf & vbCrLf & "local variable " & _ 30 "value in CScoping_Load is " & value 31 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

MethodB gebruikt de instance variabele value, en past zijn waarde aan ' automatic local variable value hides instance variable 34 Sub MethodA() 35 Dim value As Integer = 25 ' initialized after each call 36 37 lblOutput.Text &= vbCrLf & vbCrLf & "local variable " & _ 38 "value in MethodA is " & value & " after entering MethodA" 39 value += 1 40 lblOutput.Text &= vbCrLf & "local variable " & _ 41 "value in MethodA is " & value & " before exiting MethodA" 42 End Sub ' MethodA 43 44 ' uses instance variable value 45 Sub MethodB() 46 lblOutput.Text &= vbCrLf & vbCrLf & "instance variable" & _ 47 " value is " & value & " after entering MethodB" 48 value *= 10 49 lblOutput.Text &= vbCrLf & "instance variable " & _ 50 "value is " & value & " before exiting MethodB" 51 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

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

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

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

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

De compilergebruikt bvb de logische naam “Square of Integer” 1 ' Overload.vb 2 ' Using overloaded methods. 3 4 Public Class FrmOverload 5 Inherits System.Windows.Forms.Form 6 7 Friend WithEvents outputLabel As Label 8 9 ' Visual Studio .NET generated code 10 11 Private Sub FrmOverload_Load(ByVal sender As System.Object, _ 12 ByVal e As System.EventArgs) Handles MyBase.Load 13 14 outputLabel.Text = "The square of Integer 7 is " & _ 15 square(7) & vbCrLf & "The square of Double " & _ 16 "7.5 is " & square(7.5) 17 End Sub ' FrmOverload_Load 18 19 Function Square(ByVal value As Integer) As Integer 20 Return Convert.ToInt32(value ^ 2) 21 End Function ' Square 22 23 Function Square(ByVal value As Double) As Double 24 Return value ^ 2 25 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

1 ' Overload2.vb 2 ' Using overloaded procedures with identical signatures and 3 ' different return types. 4 5 Public Class FrmOverload2 6 Inherits System.Windows.Forms.Form 7 8 Friend WithEvents outputLabel As Label 9 10 ' Visual Studio .NET generated code 11 12 Private Sub FrmOverload2_Load(ByVal sender As System.Object, _ 13 ByVal e As System.EventArgs) Handles MyBase.Load 14 15 outputLabel.Text = "The square of Integer 7 is " & _ 16 square(7) & vbCrLf & "The square of Double " & _ 17 "7.5 is " & square(7.5) 18 End Sub ' FrmOverload2_Load 19 20 Function Square(ByVal value As Double) As Integer 21 Return Convert.ToInt32(value ^ 2) 22 End Function ' Square 23 24 Function Square(ByVal value As Double) As Double 25 Return value ^ 2 26 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

4.13.2 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

4.13.2 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

4.13.2 Optionele parameters We bekijken eerst de functie Power 36 37 ' use iteration to calculate power 38 Function Power(ByVal base As Integer, _ 39 Optional ByVal exponent As Integer = 2) As Integer 40 41 Dim total As Integer = 1 42 Dim i As Integer 43 44 For i = 1 To exponent 45 total *= base 46 Next 47 48 Return total 49 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

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

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

baseImageName = naam beeldje. 1 ' DiceModule.vb 2 ' A collection of common dice procedures. 3 4 Imports System.IO 5 6 Module modDice 7 8 Dim randomObject As Random = New Random() 9 10 ' rolls single die 11 Function RollDie() As Integer 12 Return randomObject.Next(1, 7) 13 End Function ' RollDie 14 15 ' die summation procedure 16 Function RollAndSum(ByVal diceNumber As Integer) _ 17 As Integer 18 19 Dim i As Integer 20 Dim sum As Integer = 0 21 22 For i = 1 To diceNumber 23 sum += RollDie() 24 Next 25 26 Return sum End Function ' RollAndSum 28 29 ' returns die image 30 Function GetDieImage(ByVal dieValue As Integer, _ 31 Optional ByVal baseImageName As String = "die") _ 32 As System.Drawing.Image 33 34 Return Image.FromFile(Directory.GetCurrentDirectory & _ 35 "\Images\" & baseImageName & dieValue & ".png") 36 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

4.14 Modules GroupBox PictureBox Button Label Visual Basic.NET

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 6 Inherits System.Windows.Forms.Form 7 Friend WithEvents lblSum As Label ' displays 10-roll sum 8 Friend WithEvents diceGroup As GroupBox 9 ' dice images 10 Friend WithEvents picDie1 As PictureBox 11 Friend WithEvents picDie2 As PictureBox 12 Friend WithEvents cmdRollDie1 As Button ' rolls blue die 13 Friend WithEvents cmdRollTen As Button ' simulates 10 rolls 14 Friend WithEvents cmdRollDie2 As Button ' rolls red die 15 ' Visual Studio .NET generated code 16 17 Private Sub cmdRollDie1_Click(ByVal sender As System.Object, _ 18 ByVal e As System.EventArgs) Handles cmdRollDie1.Click 19 20 picDie1.Image = modDice.GetDieImage(modDice.RollDie()) 21 End Sub ' cmdRollDie1_Click 22 23 Private Sub cmdRollDie2_Click(ByVal sender As System.Object, _ 24 ByVal e As System.EventArgs) Handles cmdRollDie2.Click 25 26 picDie2.Image = modDice.GetDieImage(modDice.RollDie(), "redDie") 27 End Sub ' cmdRollDie2_Click 28 Private Sub cmdRollTen_Click(ByVal sender As System.Object, _ 29 ByVal e As System.EventArgs) Handles cmdRollTen.Click 30 31 lblSum.Text = Convert.ToString(modDice.RollAndSum(10)) 32 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

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 * 100 + 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 ' 0 0 4 ' Values: ' 1 2 3 4 5 ' ' Multidimensional Array: ' Rank Lower Upper ' 0 0 1 ' 1 0 2 ' 2 0 3 ' Values: ' 0 1 2 3 ' 10 11 12 13 ' 20 21 22 23 ' 100 101 102 103 ' 110 111 112 113 ' 120 121 122 123 Visual Basic.NET

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

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

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 5 Sub Main() 6 Dim output As String 7 Dim i As Integer 8 9 Dim array1, array2 As Integer() ' declare two arrays 10 11 ' initializer list specifies number of elements 12 ' and value of each element 13 array1 = New Integer() {32, 27, 64, 18, 95, _ 14 14, 90, 70, 60, 37} 15 16 ' allocate array2 based on length of array1 17 array2 = New Integer(array1.GetUpperBound(0)) {} 18 19 ' set values in array2 by a calculation 20 For i = 0 To array2.GetUpperBound(0) 21 array2(i) = 2 + 2 * i 22 Next 23 24 output &= "Subscript " & vbTab & "Array1" & vbTab & _ 25 "Array2" & vbCrLf 26 27 ' display values for both arrays 28 For i = 0 To array1.GetUpperBound(0) 29 output &= i & vbTab & array1(i) & vbTab & array2(i) & _ 30 vbCrLf 31 Next 32 MessageBox.Show(output, "Array of Integer Values", _ 33 MessageBoxButtons.OK, MessageBoxIcon.Information) 34 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

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

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

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

1 ' ArrayReferenceTest.vb 2 ' Testing the effects of passing array references using 3 ' ByVal and ByRef. 4 5 Module modArrayReferenceTest 6 7 Sub Main() 8 Dim i As Integer 9 10 ' declare array references 11 Dim firstArray As Integer() 12 Dim firstArrayCopy As Integer() 13 14 ' allocate firstArray and copy its reference 15 firstArray = New Integer() {1, 2, 3} 16 firstArrayCopy = firstArray 17 18 Console.WriteLine("Test passing array reference " & _ 19 "using ByVal.") 20 Console.Write("Contents of firstArray before " & _ 21 "calling FirstDouble: ") 22 23 ' print contents of firstArray 24 For i = 0 To firstArray.GetUpperBound(0) 25 Console.Write(firstArray(i) & " ") 26 Next 27 28 ' pass firstArray using ByVal 29 FirstDouble(firstArray) 30 31 Console.Write(vbCrLf & "Contents of firstArray after " & _ 32 "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 24-26 : 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

34 ' print contents of firstArray 35 For i = 0 To firstArray.GetUpperBound(0) 36 Console.Write(firstArray(i) & " ") 37 Next 38 39 ' test whether reference was changed by FirstDouble 40 If firstArray Is firstArrayCopy Then 41 Console.WriteLine(vbCrLf & "The references are " & _ 42 "equal.") 43 Else 44 Console.WriteLine(vbCrLf & "The references are " & _ 45 "not equal.") 46 End If 47 48 ' declare array references 49 Dim secondArray As Integer() 50 Dim secondArrayCopy As Integer() 51 52 ' allocate secondArray and copy its reference 53 secondArray = New Integer() {1, 2, 3} 54 secondArrayCopy = secondArray 55 56 Console.WriteLine(vbCrLf & "Test passing array " & _ 57 "reference using ByRef.") 58 Console.Write("Contents of secondArray before " & _ 59 "calling SecondDouble: ") 60 61 ' print contents of secondArray before procedure call 62 For i = 0 To secondArray.GetUpperBound(0) 63 Console.Write(secondArray(i) & " ") 64 Next 65 66 ' pass secondArray using ByRef 67 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 48-84 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

Elk element van de array wordt met 2 vermenigvuldigd 69 Console.Write(vbCrLf & "Contents of secondArray " & _ 70 "after calling SecondDouble: ") 71 72 ' print contents of secondArray after procedure call 73 For i = 0 To secondArray.GetUpperBound(0) 74 Console.Write(secondArray(i) & " ") 75 Next 76 77 ' test whether the reference was changed by SecondDouble 78 If secondArray Is secondArrayCopy Then 79 Console.WriteLine(vbCrLf & "The references are " & _ 80 "equal.") 81 Else 82 Console.WriteLine(vbCrLf & "The references are " & _ 83 "not equal.") 84 End If 85 86 End Sub ' Main 87 88 ' procedure modifies elements of array and assigns 89 ' new reference (note ByVal) 90 Sub FirstDouble(ByVal array As Integer()) 91 Dim i As Integer 92 93 ' double each element value 94 For i = 0 To array.GetUpperBound(0) 95 array(i) *= 2 96 Next 97 98 ' create new reference and assign it to array 99 array = New Integer() {11, 12, 13} 100 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

4.17 Passing Arrays : ByVal of ByRef 102 ' procedure modifies elements of array and assigns 103 ' new reference (note ByRef) 104 Sub SecondDouble(ByRef array As Integer()) 105 Dim i As Integer 106 107 ' double contents of array 108 For i = 0 To array.GetUpperBound(0) 109 array(i) *= 2 110 Next 111 112 ' create new reference and assign it to array 113 array = New Integer() {11, 12, 13} 114 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: 11 12 13 The references are not equal. Visual Basic.NET

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

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

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

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 24-31 : 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 37-44 : 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

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

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 6 Sub Main() 7 Dim gradeArray As Integer(,) = New Integer(,) _ 8 {{77, 68, 86, 73}, {98, 87, 89, 81}, {70, 90, 86, 81}} 9 10 Dim grade As Integer 11 Dim lowGrade As Integer = 100 12 13 For Each grade In gradeArray 14 15 If grade < lowGrade Then 16 lowGrade = grade 17 End If 18 19 Next 20 21 Console.WriteLine("The minimum grade is: {0}", lowGrade) 22 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

Oefening Flag Quiz Visual Basic.NET

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 7 Dim lastStudent, lastExam As Integer 8 Dim output As String 9 10 Sub Main() 11 Dim i As Integer 12 13 ' jagged array with 3 rows of exam scores 14 Dim gradeArray As Integer()() = New Integer(2)() {} 15 16 ' allocate each row with 4 student grades 17 gradeArray(0) = New Integer() {77, 68, 86, 73} 18 gradeArray(1) = New Integer() {98, 87, 89, 81} 19 gradeArray(2) = New Integer() {70, 90, 86, 81} 20 21 ' upper bounds for array manipulations 22 lastStudent = gradeArray.GetUpperBound(0) 23 lastExam = gradeArray(0).GetUpperBound(0) 24 25 output = "Students \ Exams" & vbCrLf 26 27 ' build output string 28 BuildString(gradeArray) 29 output &= vbCrLf & vbCrLf & "Lowest grade: " & _ 30 Minimum(gradeArray) & vbCrLf & "Highest grade: " & _ 31 Maximum(gradeArray) & vbCrLf ' calculate each student's average 34 For i = 0 To lastStudent 35 output &= vbCrLf & "Average for student " & _ 36 i & " is " & Average(gradeArray(i)) 37 Next 38 39 MessageBox.Show(output, "Jagged two-dimensional array", _ 40 MessageBoxButtons.OK, MessageBoxIcon.Information) 41 End Sub ' Main 42 43 ' find minimum grade 44 Function Minimum(ByVal grades As Integer()()) _ 45 As Integer 46 47 Dim lowGrade As Integer = 100 48 Dim i, j As Integer 49 50 For i = 0 To lastStudent 51 52 For j = 0 To lastExam 53 54 If grades(i)(j) < lowGrade Then 55 lowGrade = grades(i)(j) 56 End If 57 58 Next 59 60 Next 61 62 Return lowGrade 63 End Function ' Minimum 64 ' find the maximum grade 66 Function Maximum(ByVal grades As Integer()()) _ 67 As Integer 68 69 Dim highGrade As Integer = 0 70 Dim i, j As Integer 71 72 For i = 0 To lastStudent 73 74 For j = 0 To lastExam 75 76 If grades(i)(j) > highGrade Then 77 highGrade = grades(i)(j) 78 End If 79 80 Next 81 82 Next 83 84 Return highGrade 85 End Function ' Maximum 86 87 ' determine the average grade for student 88 ' (or set of grades) 89 Function Average(ByVal setOfGrades As Integer()) _ 90 As Double 91 92 Dim i As Integer, total As Integer = 0 93 94 ' find sum of student's grades 95 For i = 0 To lastExam 96 total += setOfGrades(i) 97 Next 98 99 Return total / setOfGrades.Length 100 End Function ' Average 101 102 ' creates String displaying array 103 Sub BuildString(ByVal grades As Integer()()) 104 Dim i, j As Integer 105 106 ' align column heads 107 output &= " " 108 109 For i = 0 To lastExam 110 output &= "(" & i & ") " 111 Next 112 113 For i = 0 To lastStudent 114 output &= vbCrLf & " (" & i & ") " 115 116 For j = 0 To lastExam 117 output &= grades(i)(j) & " " 118 Next 119 120 Next 121 122 End Sub ' BuildString 123 124 End Module ' modJaggedArray Visual Basic.NET

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

Klassen diagramma eerste oefening Visual Basic.NET

Sequence diagramma eerste oefening Visual Basic.NET

4.9 By-Value en By-Reference 1 ByRefTest.vb 2 ' Demonstrates passing by reference. 3 4 Module modByRefTest 5 6 ' squares three values ByVal and ByRef, displays results 7 Sub Main() 8 Dim number1 As Integer = 2 9 10 Console.WriteLine("Passing a value-type argument by value:") 11 Console.WriteLine("Before calling SquareByValue, " & _ 12 "number1 is {0}", number1) 13 SquareByValue(number1) ' passes number1 by value 14 Console.WriteLine("After returning from SquareByValue, " & _ 15 "number1 is {0}" & vbCrLf, number1) 16 17 Dim number2 As Integer = 2 18 19 Console.WriteLine("Passing a value-type argument" & _ 20 " by reference:") 21 Console.WriteLine("Before calling SquareByReference, " & _ 22 "number2 is {0}", number2) 23 SquareByReference(number2) ' passes number2 by reference 24 Console.WriteLine("After returning from " & _ 25 "SquareByReference, number2 is {0}" & vbCrLf, number2) 26 27 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

4.9 By-Value en By-Reference 29 Console.WriteLine("Passing a value-type argument" & _ 30 " by reference, but in parentheses:") 31 Console.WriteLine("Before calling SquareByReference " & _ 32 "using parentheses, number3 is {0}", number3) 33 SquareByReference((number3)) ' passes number3 by value 34 Console.WriteLine("After returning from " & _ 35 "SquareByReference, number3 is {0}", number3) 36 37 End Sub ' Main 38 39 ' squares number by value (note ByVal keyword) 40 Sub SquareByValue(ByVal number As Integer) 41 Console.WriteLine("After entering SquareByValue, " & _ 42 "number is {0}", number) 43 number *= number 44 Console.WriteLine("Before exiting SquareByValue, " & _ 45 "number is {0}", number) 46 End Sub ' SquareByValue 47 48 ' squares number by reference (note ByRef keyword) 49 Sub SquareByReference(ByRef number As Integer) 50 Console.WriteLine("After entering SquareByReference" & _ 51 ", number is {0}", number) 52 number *= number 53 Console.WriteLine("Before exiting SquareByReference" & _ 54 ", number is {0}", number) 55 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

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

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 7 Inherits System.Windows.Forms.Form 8 9 Friend WithEvents cmdRoll As Button ' rolls dice 10 Friend WithEvents cmdPlay As Button ' starts new game 11 12 ' dice displayed after each roll 13 Friend WithEvents picDie1 As PictureBox 14 Friend WithEvents picDie2 As PictureBox 15 16 ' pointDiceGroup groups dice representing player's point 17 Friend WithEvents pointDiceGroup As GroupBox 18 Friend WithEvents picPointDie1 As PictureBox 19 Friend WithEvents picPointDie2 As PictureBox 20 21 Friend WithEvents lblStatus As Label 22 23 ' Visual Studio .NET generated code 24 25 ' die-roll constants 26 Enum DiceNames 27 SNAKE_EYES = 2 28 TREY = 3 29 CRAPS = 7 30 YO_LEVEN = 11 31 BOX_CARS = 12 32 End Enum 33 34 ' file-name and directory constants 35 Const FILE_PREFIX As String = "/images/die" 36 Const FILE_SUFFIX As String = ".png" 37 38 Dim myPoint As Integer 39 Dim myDie1 As Integer 40 Dim myDie2 As Integer 41 Dim randomObject As Random = New Random() 42 43 ' begins new game and determines point 44 Private Sub cmdPlay_Click(ByVal sender As System.Object, _ 45 ByVal e As System.EventArgs) Handles cmdPlay.Click 46 47 ' initialize variables for new game 48 myPoint = 0 49 pointDiceGroup.Text = "Point" 50 lblStatus.Text = "" 51 52 ' remove point-die images 53 picPointDie1.Image = Nothing 54 picPointDie2.Image = Nothing 55 56 Dim sum As Integer = RollDice() 57 58 ' check die roll 59 Select Case sum 60 61 Case DiceNames.CRAPS, DiceNames.YO_LEVEN 62 63 ' disable roll button 64 cmdRoll.Enabled = False 65 lblStatus.Text = "You Win!!!" 66 67 Case DiceNames.SNAKE_EYES, _ 68 DiceNames.TREY, DiceNames.BOX_CARS 69 70 cmdRoll.Enabled = False 71 lblStatus.Text = "Sorry. You Lose." 72 73 Case Else 74 myPoint = sum 75 pointDiceGroup.Text = "Point is " & sum 76 lblStatus.Text = "Roll Again!" 77 DisplayDie(picPointDie1, myDie1) 78 DisplayDie(picPointDie2, myDie2) 79 cmdPlay.Enabled = False 80 cmdRoll.Enabled = True 81 82 End Select 83 84 End Sub ' cmdPlay_Click 85 86 ' determines outcome of next roll 87 Private Sub cmdRoll_Click(ByVal sender As System.Object, _ 88 ByVal e As System.EventArgs) Handles cmdRoll.Click 89 90 Dim sum As Integer = RollDice() 91 92 ' check outcome of roll 93 If sum = myPoint Then 94 lblStatus.Text = "You Win!!!" 95 cmdRoll.Enabled = False 96 cmdPlay.Enabled = True 97 ElseIf sum = DiceNames.CRAPS Then 98 lblStatus.Text = "Sorry. You Lose." 99 cmdRoll.Enabled = False 100 cmdPlay.Enabled = True 101 End If 102 103 End Sub ' cmdRoll_Click 104 105 ' display die image 106 Sub DisplayDie(ByVal picDie As PictureBox, _ 107 ByVal face As Integer) 108 109 ' assign die image to picture box 110 picDie.Image = _ 111 Image.FromFile(Directory.GetCurrentDirectory & _ 112 FILE_PREFIX & face & FILE_SUFFIX) 113 End Sub ' DisplayDie 114 115 ' generate random die rolls 116 Function RollDice() As Integer 117 Dim die1, die2 As Integer 118 119 ' determine random integer 120 die1 = randomObject.Next(1, 7) 121 die2 = randomObject.Next(1, 7) 122 123 ' display rolls 124 DisplayDie(picDie1, die1) 125 DisplayDie(picDie2, die2) 126 127 ' set values 128 myDie1 = die1 129 myDie2 = die2 130 131 Return die1 + die2 132 End Function ' RollDice 133 134 End Class ' FrmCrapsGame Visual Basic.NET

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 8 Sub Main() 9 Dim output As String 10 Dim i As Integer 11 12 Dim array As Integer() ' declare array variable 13 array = New Integer(9) {} ' allocate memory for array 14 15 output &= "Subscript " & vbTab & "Value" & vbCrLf 16 17 ' display values in array 18 For i = 0 To array.GetUpperBound(0) 19 output &= i & vbTab & array(i) & vbCrLf 20 Next 21 22 output &= vbCrLf & "The array contains " & _ 23 array.Length & " elements." 24 25 MessageBox.Show(output, "Array of Integer Values", _ 26 MessageBoxButtons.OK, MessageBoxIcon.Information) 27 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

Oefening 2 Visual Basic.NET

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 7 Dim output As String 8 9 Sub Main() 10 Dim array1 As Integer() = New Integer() {1, 2, 3, 4, 5} 11 Dim i As Integer 12 13 output = "EFFECTS OF PASSING ENTIRE ARRAY " & _ 14 "BY REFERENCE:" & vbCrLf & vbCrLf & _ 15 "The values of the original array are:" & vbCrLf 16 17 ' display original elements of array1 18 For i = 0 To array1.GetUpperBound(0) 19 output &= " " & array1(i) 20 Next 21 22 ModifyArray(array1) ' array is passed by reference 23 24 output &= vbCrLf & _ 25 "The values of the modified array are:" & vbCrLf 26 27 ' display modified elements of array1 28 For i = 0 To array1.GetUpperBound(0) 29 output &= " " & array1(i) 30 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

Vermenigvuldigd de elementen van arrayParameter met 2 32 output &= vbCrLf & vbCrLf & _ 33 "EFFECTS OF PASSING ARRAY ELEMENT " & _ 34 "BY VALUE:" & vbCrLf & vbCrLf & "array1(3) " & _ 35 "before ModifyElementByVal: " & array1(3) 36 37 ' array element passed by value 38 ModifyElementByVal(array1(3)) 39 40 output &= vbCrLf & "array1(3) after " & _ 41 "ModifyElementByVal: " & array1(3) 42 43 output &= vbCrLf & vbCrLf & "EFFECTS OF PASSING " & _ 44 "ARRAY ELEMENT BY REFERENCE: " & vbCrLf & vbCrLf & _ 45 "array1(3) before ModifyElementByRef: " & array1(3) 46 47 ' array element passed by reference 48 ModifyElementByRef(array1(3)) 49 50 output &= vbCrLf & "array1(3) after " & _ 51 "ModifyElementByRef: " & array1(3) 52 53 MessageBox.Show(output, "Passing Arrays", _ 54 MessageBoxButtons.OK, MessageBoxIcon.Information) 55 End Sub ' Main 56 57 ' procedure modifies array it receives (note ByVal) 58 Sub ModifyArray(ByVal arrayParameter As Integer()) 59 Dim j As Integer 60 61 For j = 0 To arrayParameter.GetUpperBound(0) 62 arrayParameter(j) *= 2 63 Next 64 65 End Sub ' ModifyArray 66 Vermenigvuldigd de elementen van arrayParameter met 2 Visual Basic.NET

Vermenigvuldigd een elementen met 2 - Byval 67 ' procedure modifies integer passed to it 68 ' original is not be modified (note ByVal) 69 Sub ModifyElementByVal(ByVal element As Integer) 70 71 output &= vbCrLf & "Value received in " & _ 72 "ModifyElementByVal: " & element 73 element *= 2 74 output &= vbCrLf & "Value calculated in " & _ 75 "ModifyElementByVal: " & element 76 End Sub ' ModifyElementByVal 77 78 ' procedure modifies integer passed to it 79 ' original is be modified (note ByRef) 80 Sub ModifyElementByRef(ByRef element As Integer) 81 82 output &= vbCrLf & "Value received in " & _ 83 "ModifyElementByRef: " & element 84 element *= 2 85 output &= vbCrLf & "Value calculated in " & _ 86 "ModifyElementByRef: " & element 87 End Sub ' ModifyElementByRef 88 89 End Module ' modPassArray Vermenigvuldigd een elementen met 2 - Byval Vermenigvuldigd een elementen met 2 - ByRef Visual Basic.NET