Visual Basic 2005 Coach



Dovnload 477.64 Kb.
Pagina11/13
Datum20.08.2016
Grootte477.64 Kb.
1   ...   5   6   7   8   9   10   11   12   13

9. Nieuw in Visual Basic 2005

In de vorige secties hebt u kennis gemaakt met de .NET versie van Visual Basic, meer bepaald het object-geöriënteerde karakter van de taal. Alle zaken die hierboven besproken werden zijn dan ook van toepassing voor zowel Visual Basic .NET 2002 en 2003 als de nieuwe versie Visual Basic 2005. In deze sectie zullen we echter ingaan op zaken die nieuw zijn in Visual Basic 2005. De meeste van deze vernieuwingen zijn echter niet puur Visual Basic gerelateerd, maar hebben te maken met wijzigingen aan het onderliggende .NET Framework versie 2.0. Dit alles leidt tot een reductie van code met (geschat) 50% voor typische ontwikkeltaken. We kunnen in feite een aantal categorieën vernieuwingen onderscheiden:




  • Innovatie op het gebied van talen;

  • Verbetering van de compilers;

  • Nieuwe functionaliteiten in de Base Class Library;

  • Een vernieuwde ontwikkelomgeving (IDE);

  • Krachtigere debuggerondersteuning.

Dit alles leidt tot een verhoogde productiviteit en meer robuuste code. Laten we ons eerst concentreren op een aantal nieuwe features in de Visual Basic 2005 taal.



9.1. Generics

9.1.1. Uit het leven gegrepen: collecties

Hergebruik van klassen is één van de belangrijkste zaken om snel krachtige applicaties te bouwen. Dat hergebruik van klassen kan op diverse manieren gerealiseerd worden. Zo is object-oriëntatie op zichzelf al een manier om iets dergelijks te bewerkstelligen. Maar we kunnen véél verder gaan dan dat. Generics passen perfect in dit verhaal.


Eén van de zaken die u in quasi elke applicatie ontmoet, zijn collecties. Zo zal u ongetwijfeld al lijsten van objecten hebben bijgehouden in uw toepassing om daarna manipulaties op die lijsten uit te voeren. Andere soorten collecties zoals dictionaries, hashtables, sets, e.d. zijn eveneens schering en inslag in moderne applicaties. In .NET 1.x ziet het gebruik van dergelijke collecties er als volgt uit:
'Een aantal auto objecten

Dim wagen1 As New Auto()

Dim wagen2 As New Auto()
'Instantiatie van een "lineaire parking"

Dim parking As New ArrayList()


'Wagens toevoegen aan de lijst

parking.Add(wagen1)

parking.Add(wagen2)
'Auto's ophalen uit de lijst

Dim wagen1bis As Auto = parking(0)

Dim wagen2bis As Auto = parking(1)
Op zich is hier niks mee, de System.Collections.ArrayList collectie werkt perfect, mede door de late binding in Visual Basic. In C# zijn de problemen iets duidelijker zichtbaar :
//Een aantal auto objecten

Auto wagen1 = new Auto();

Auto wagen2 = new Auto();
//Instantiatie van een "lineaire parking"

ArrayList parking = new ArrayList();


//Wagens toevoegen aan de lijst

parking.Add(wagen1);

parking.Add(wagen2);
//Auto's ophalen uit de lijst

Auto wagen1bis = (Auto) parking[0];

Auto wagen2bis = (Auto) parking[1];
In de laatste twee lijnen ziet u casting van objecten. De ArrayList collectie werkt immers met de moeder der objecten, System.Object. Daardoor kan een dergelijke collectie objecten van elk mogelijk type bevatten. Dit heeft echter ook zijn problemen, zoals het volgende:
'Wagens toevoegen aan de lijst

parking.Add(wagen1)

parking.Add("Addertje onder het gras")
Veronderstel dat het parking object doorgegeven wordt aan een andere procedure die een lijst van Auto-instanties verwacht en volgende code uitvoert:
Sub ControleerParkingTickets(ByRef parking As ArrayList)

Dim wagen As Auto


For Each wagen In parking

'Controleer parkeerticket onder de ruit

Next

End Sub
Deze code zal feilloos werken zolang een correcte lijst van wagens wordt doorgegeven. Als deze lijst echter een vreemde eend bevat, zal het programma crashen. De compiler kan hier niks aan veranderen vermits een ArrayList nu eenmaal gebouwd is om te werken met objecten van het type System.Object. Generics lossen dergelijke problemen op, maar laten we eerst nog een ander probleempje onder de loep nemen. Werp een blik op volgend codefragment:


Dim lst As New ArrayList()

lst.Add(123)

Dim i As Integer = lst(0)
Hierin wordt een ArrayList gedefinieerd die gehele getallen bevat. Zoals eerder vermeld, bevat een ArrayList instanties van het type System.Object. Integers zijn echter “waardetypes” en geen “referentietypes”. Een omzetting is dus nodig om van het getal 123 een echt object te maken. In bovenstaand stukje code gebeurt dit automatisch via een systeem genaamd boxing. Wanneer het item terug uit de lijst wordt gehaald, gebeurt het omgekeerde oftwel unboxing. Deze operaties hebben echter een aanzienlijke performantiekost die ook door generics kan opgelost worden.

9.1.2. Van start met generics

Generics kunnen qua principe enigzins vergeleken worden met templates uit C++. Concreet komt het erop neer dat generieke functionaliteit – onafhankelijk van een bepaald datatype – wordt gebouwd die daarna verder gespecialiseerd kan worden bij instantie van een klasse of bij oproep van een procedure. Een beetje te abstract? Neem een kijkje op volgende code:


Dim lst As New List(Of Integer)

lst.Add(123)

Dim i As Integer = lst(1)
Dit is de generieke equivalent van het vorige codefragment waarbij de niet-generieke collectie ArrayList gebruikt werd. Het verschil ziet u onder andere bij de IntelliSense:

In bovenstaande screenshot merkt u dat de lijst nu weet welk type objecten erin gestockeerd zal worden. Ook bij het opvragen van items uit de lijst krijgt u meteen strong-typing:


Probeert u een object met een foutief type toe te voegen aan de lijst, dan zal een exceptie opgeworpen worden bij uitvoering:

Noot: Hier wijkt Visual Basic af van C# waarin dergelijke fouten al tijdens compilatie worden onderschept:

De collectie List die werd gebruikt, is terug te vinden in System.Collections.Generic. Andere collecties in deze namespace zijn LinkedList, Dictionary, SortedList, SortedDictionary, Stack en Queue. Het gebruik van dergelijke collecties leidt tot een verhoogde type safety en draagt ook bij tot een betere performantie. Ook op andere plaatsen in de Base Class Library vindt u het gebruik van generics terug, te herkennen aan het sleutelwoord Of in de definitie:
Dim stemTelling As New Dictionary(Of String, Integer)

stemTelling("De appelblauwzeegroene partij") += 3

stemTelling("Paars met groene stippen") += 4

9.1.3. Generieke types definiëren

Naast het gebruik van vooraf gedefinieerde generieke types kunt u met Visual Basic 2005 ook uw eigen generieke types definiëren. In deze sectie bespreken we dit in meer detail aan de hand van een eigen collectietype voor (ongeordende) verzamelingen van objecten:


Public Class Verzameling(Of T)

Public Sub Add(ByVal element As T)

'Implementatie

End Sub
Public Sub Remove(ByVal element As T)

'Implementatie

End Sub


End Class
Bij definitie van een generiek type voegt u een typeparameter toe aan de declaratie van het type, met behulp van het sleutelwoord Of. U kan deze typeparameter om het even welke naam geven aangezien deze gewoon als placeholder dienst doet. Het is pas als u de klasse gaat gebruiken dat deze typeparameter ingevuld wordt:
Dim lottotrekking As New Verzameling(Of Integer)
Dim r As New Random()
Dim i As Integer

For i = 1 To 6

lottotrekking.Add(r.Next(1, 43))

Next i
Niet enkel klassen kunnen als generiek worden gedefinieerd zoals u hieronder te zien krijgt.



9.1.4. Generieke methodes

Ook methoden kunnen als generiek gedefinieerd worden. Een typisch voorbeeld van dit is het definiëren van een algemeen sorteeralgoritme dat werk ongeacht het onderliggende type. Beschouw een methode zoals de volgende:


Public Sub Sort(ByVal array() As Object)

'Implementatie, maar hoe?

End Sub
Hoewel de signatuur van de methode veelbelovend lijkt – een Object-array kan immers ingezet worden voor om het even welk type – treden hier weer problemen op zoals type safety maar ook de vraag hoe deze methode intern geïmplementeerd moet worden blijft open. Met generics kunnen we deze problemen van de baan ruimen:
Public Sub Sort(Of T)(ByVal array() As T)

'Implementatie al ietsje gemakkelijker?

End Sub
Het gebruik ziet er dan als volgt uit:
Dim eenLijstje() As Integer = {1, 3, 8, 34, 5, 1, 2, 13, 21}

Sort(Of Integer)(eenLijstje)


Dim personeel() As String = {"Bart", "Jan", "Piet"}

Sort(Of String)(personeel)


De vraag rest echter hoe we op een efficiënte manier de implementatie van de sorteertmethode kunnen bouwen. Uiteindelijk hebben we nood aan een manier om twee elementen uit de generieke tabel met elkaar te vergelijken. Dit is waar het concept constraints op de proppen komt.

9.1.5. Beperkingen opleggen

Constraints, vrij vertaald als “beperkingen”, vormen een manier om limitaties op te leggen op de typeparameter van een generieke klasse of methode. Voor het sorteervoorbeeld zouden we gebruik kunnen maken van de interface IComparable uit de Base Class Library die toelaat twee objecten met elkaar te vergelijken op ordening (“groter dan”, “kleiner dan”, “gelijk”):


Public Sub Sort(Of T As IComparable)(ByVal array() As T)

'Quicksort, bubble-sort, insertion sort of wat dan ook

End Sub
Om een beperking op te leggen gebruikt u dus het keyword Of in combinatie met As. Opnieuw verraadt IntelliSense waartoe dit leidt:

Door het gebruik van de constraint wordt de methode CompareTo uit de interface IComparable beschikbaar voor de implementatie van de methode. Op een analoge manier kan men ook constraints gebruiken bij de definitie van een generiek type:
Public Class GesorteerdeVerzameling(Of T As IComparable)

Public Sub Add(ByVal element As T)

'Implementatie voor toevoeging op juiste positie

End Sub
Public Sub Remove(ByVal element As T)

'Implementatie voor verwijdering

End Sub


End Class
Merk op dat de IDE foutief gebruik reeds kan detecteren indien het doorgegeven type de interface IComparable niet implementeert:

Verder kan men ook vereisten opleggen op de beschikbare constructoren van het gebruikte type. Veronderstel dat u binnen de generieke functionaliteit (een methode of een klasse) instanties van het opgegeven type wenst aan te maken, dan hebt u uiteraard nood aan een gepaste constructor. Via constructor constraints kan u dergelijke berpekingen opleggen:
Public Class Factory(Of T As New)

Public Function GetInstance() As T

Return New T()

End Function

End Class
Om deze code te kunnen schrijven, hebben we nood aan een parameterloze constructor op het gespecifieerde type. Via de constraint Of T As New leggen we deze eis op.
Indien u enkel referentietypes wenst toe te laten als typeparameters kunt u een constraint opleggen via Of T As Class. In een dergelijk geval kan u dus wél een Auto-type doorgeven als typeparameter maar zal het gebruik van bijvoorbeeld Integer niet toegestaan zijn.
Tot slot merken we nog op dat het ook mogelijk is meerdere constraints op te leggen via volgende syntax:
Public Class EenVoorbeeld(Of T As {IComparable, IDisposable, New, Class})



1   ...   5   6   7   8   9   10   11   12   13


De database wordt beschermd door het auteursrecht ©opleid.info 2017
stuur bericht

    Hoofdpagina