Standaard operators in .NET – Deel 1

Dit is een reeds eerder gepubliceerde post van de vorige VBcentral website door Arjan van Huizen

Een programma kan veel .NET code bevatten en veel van die code is vaak code waarbij manipulaties op getallen en tekenreeksen(String) gedaan worden. Deze worden ook wel Operators genoemd. Operatoren, in het Nederlands, zijn gewoon de methodes van een bepaalde klasse. Voorbeelden zijn de bekende VB Left, Right en Mid functies uit de Visual Basic NameSpace. Deze werken nog prima, maar het is beter om de .NET varianten te gaan gebruiken en de Visual Basic NameSpace zelfs helemaal uit te schakelen in het Project! Als je dit doet wordt ook meteen duidelijk wat nog Legacy code is want die zal niet willen compileren!

Bij het converteren van VB6 naar VB.NET code via Visual Studio 2005 of 2008 zorgt de NameSpace Microsoft.VisualBasic.Compatibility ervoor dat de gemigreerde VB6 code nog kan draaien. Deze moet natuurlijk ook zo snel mogelijk verdwijnen in je projecten om je applicatie een echte VB.NET applicatie te mogen noemen.

In deze artikel reeks maak ik een opsomming van de meest voorkomende functies waarbij ik, indien handig en van toepassing, eerst de oude ‘vertrouwde’ VB6 methode geef als geheugensteuntje en daarna de .NET variant. Hierbij zal blijken dat de meeste functies nog hetzelfde heten. Maar doordat VB.NET nu volledig object georienteerd is zal de functie/methode aangeroepen worden als: Object.Methode(parameters). Daarnaast zijn er ook nieuwe functies in VB.NET beschikbaar die het net even gemakkelijker maken om een bepaalde bewerking te doen op een tekst.

We gaan als eerste kijken naar de String operators. In een volgend deel komen de Numerieke- en de DateTime functies aan bod. Onderaan dit artikel alvast wel een opsomming van ‘Overige’ functies in VB.NET die ik jullie niet wil onthouden.

STRING OPERATORS

Left, Right en Mid in VB en VB.NET notatie

 
Option Strict On  
Imports VB6 = Microsoft.VisualBasic 
 
Public Class Form1 
 
Private mijnTekst As String = "Programmeren is leuk" 
 
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
 
    'String manipulatie (VB6 methode)  
    MessageBox.Show(VB6.Left(mijnTekst, 7)) 
    MessageBox.Show(VB6.Right(mijnTekst, 4)) 
    MessageBox.Show(VB6.Mid(mijnTekst, 14, 2)) 
 
End Sub 
 
 
 
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click 
 
    'String manipulatie (.NET methode)  
    MessageBox.Show(mijnTekst.Substring(0, 7)) 'Left  
    MessageBox.Show(mijnTekst.Substring(mijnTekst.Length - 4, 4)) 'Right  
    MessageBox.Show(mijnTekst.Substring(13, 2)) 'Mid  
 
End Sub 
End Class 


Probeer deze code maar eens uit en bekijk de resultaten. Let op dat het gebruik van SubString zero-based is. Dit is duidelijk te zien bij het equivalent van de Mid functie waarbij het woord ‘is’ op positie 13 start en niet op 14. Verder wordt ook duidelijk dat je met de methode SubString van String alles kunt doen waar je voorheen 3 methodes voor nodig had. Wel is het nabootsen van een Right functie wat lastiger, want daar moet je nog even de lengte van je tekst bepalen met String.Length( )

Het bepalen van een karakter of een tekenreeks in een String doe je met het keyword InStr(), in .NET is dat ook weer een Methode op de (Base) Class System.String en wel IndexOf(). Deze is ook weer zero-based waar InStr() dat niet is. Een voorbeeld:
 
'Positie bepalen van een karakter in een tekenreeks  
Dim karakter As String = "-" 
 
'gebruik van VB6 Instr(): 
Dim telefoonNummer As String = "010-1234567" 
MessageBox.Show(String.Format("Het karakter {0} bevindt zich op positie {1}", karakter, VB6.InStr(telefoonNummer, karakter)))  
 
'.NET methode IndexOf()  
MessageBox.Show(String.Format("Het karakter {0} bevindt zich op positie {1}", karakter, telefoonNummer.IndexOf(karakter))) 


MessageBox 
Waarschijnlijk was het al opgevallen dat ik gebruik maak van MessageBox.Show( ). Maar dit is ook de .NET manier van berichtvensters weergeven. MsgBox ( ) werkt nog wel, maar is ook vervangen in .NET.

Er zijn nog veel meer operators die in VB6 wat moeilijker te maken waren en niet met één keyword aangeroepen konden worden. Maar die nu wel in .NET standaard aanwezig zijn. Een paar voorbeelden van Verwijderen, Vervangen, Invoegen en Vergelijken.
 
'Overige VB.NET String bewerkingen  
Dim telefoonNummer As String = "010-1234567" 
 
'Verwijderen van een karakter in een tekenreeks  
MessageBox.Show(telefoonNummer.Remove(3, 1)) 'verwijdert het karakter '-' uit de reeks  
 
'Vervangen van één of meerdere karakters 
MessageBox.Show(telefoonNummer.Replace("010", "020")) 
 
 
'Invoegen van één of meerdere karakters in een tekenreeks 
MessageBox.Show(telefoonNummer.Insert(0, "Mijn telefoonnummer is ")) 
 
 
'Bevat de tekenreeks een bepaald karakter of een aansluitende reeks? Retourneert een Boolean True of False 
MessageBox.Show(telefoonNummer.Contains("030").ToString()) 
 
Dim naam1 As String = "vbcentral" 
Dim naam2 As String = "VBCENTRAL" 
 
'Vergelijk 2 tekenreeksen met elkaar.  
'Uitkomst retourneert -1 als ze niet gelijk zijn en 0 bij overeenkomst. 
'De 3e parameter is 'IgnoreCase ?'  
 
'Bij het weglaten van True als 3e parameter zullen naam1 en naam2 niet aan elkaar gelijk zijn als uitkomst!  
 
MessageBox.Show(String.Compare(naam1, naam2, True).ToString()) 
 
'Tekenen van meerdere karakters met PadLeft of PadRight  
'Bij het weglaten van het karakter worden er Spaces getekend. Deze functie kan dus ook gebruikt worden als het equivalent van Space(5)  
 
Dim s As String = "" 
MessageBox.Show(s.PadLeft(10, "*"c)) 
  


Er zijn ook methoden die niet vervangen zijn in .NET, een voorbeeld daarvan is de VB6 InputBox( ). Hiervoor bestaat in VB.NET geen directe vervanging. Hiervoor zul je zelf iets moeten bouwen in de vorm van een UserControl of het nabootsen met een TextBox en Button op je User Interface zoals een Windows Form.

Upper en Lower case

Ook het omzetten van teksten in hoofdletters en kleine letters wijkt af. Een voorbeeld:
 
 
'Tekenreeksen omzetten naar Lower of Upper case 
Dim s As String = "VBcentral"  
 
'VB6 methode: 
MessageBox.Show(VB6.UCase(s)) 'Hoofdletters  
 
MessageBox.Show(VB6.LCase(s)) 'Kleine letters  
 
'VB.NET methode  
MessageBox.Show(s.ToUpper) 'Hoofdletters  
MessageBox.Show(s.ToLower) 'Kleine letters 


Trim( )

Voor het verwijderen van spaties links en rechts van een tekenreeks maak je gebruik van Trim(tekst) in VB6. In VB.NET is dat: 
 Tekst.Trim()

Je roept hier dus ook weer de methode aan op het String object zelf. Door het OO karakter van VB.NET kun je ervan uitgaan dat je altijd de Methode op het object aanroept. Ook combinaties zijn mogelijk en geeft overzichtelijke code. De functies zullen van links naar rechts afgewerkt worden:
 
'Combi met Trim functie:  
Dim naam As String = " VBcentral "  
MessageBox.Show(s.ToLower.Trim()) 


Combinatie van functies 
Nu we een aantal functies gezien hebben kunnen we deze ook verder gaan combineren. Stel dat we een generieke functie willen bouwen voor het kunnen losmaken van een gedeelte midden uit een variabele String. Je wilt de 2e reeks getallen halen uit: “123 456 789” en uit “1234 567 890”. In het 1e geval begint de 2e reeks getallen op positie 4 en in het andere geval op positie 5. We zullen dus eerst moeten bepalen waar de spatie begint.We kunnen dit doen met behulp van de IndexOf functie. De code:
 
'Gedeelte van een String uit een reeks halen 
Dim reeks As String = " 123 456 789 "   
 
'Bepaal de positie van 1e spatie en tel er 1 bij op om op het 1e cijfer te starten van de 2e reeks 
Dim EerstePositie As Integer = reeks.Trim.IndexOf(" ") + 1  
 
'Bepaal de positie van de 2 spatie en begin aan het eind van de String 
Dim tweedePositie As Integer = reeks.Trim.LastIndexOf(" ")  
 
'Start op 1e positie met de lengte van het verschil tussen de 2e en 1e positie  
Dim gedeelteReeks As String = reeks.Trim.Substring(EerstePositie, tweedePositie - EerstePositie) 


Bovenstaande code werkt prima, maar het mag duidelijk zijn dat het een paar regels kost en het nadeel is hier dat we alleen de 2e reeks kunnen losmaken uit de reeks. Wat als we nu de laatste of de 1e reeks willen hebben, of allemaal gescheiden? Dat kan ook en daar hebben we de functie String.Split voor. Het karakter waarop gescheiden moet worden is ons geval een spatie en moet van het type Char zijn. Een kleine conversie is daar dus voor nodig. Als we de gedeelteReeksArray variabele bekijken dan zien we dat nu de drie getallen groepjes netjes gescheiden in de Array aanwezig zijn. Het is daarna een kwestie van het juiste element aanroepen. 

 
'Korter alternatief met Split  
Dim gedeelteReeksArray() As String  
 
gedeelteReeksArray = reeks.Trim.Split(Convert.ToChar(" "))  
gedeelteReeks = gedeelteReeksArray(1) 

OVERIGE

Er zijn ook nog meer functies die in VB.NET anders heten en een afwijkende syntax kunnen hebben:

Omschrijving VB6 VB.NET Opmerking
Geef ASCII waarde van een karakter (char) Asc(“A”)

Convert.ToInt32("A"c)

De kleine c wil zeggen dat hij de tekst als Char moet behandelen en niet als String. Er mag dan ook maar 1 karakter staan.

Geef een Char terug aan de hand van een getal Chr(65) Convert.ToChar(65) Geeft ‘A’ terug
Controle op Leeg =”” of isNull(tekenreeks) of Len(tekenreeks)=0 String.IsNullOrEmpty(TekenReeks) Controleert in 1x op Null of Lege (Empty) waarde. Geeft een Boolean True of False terug.

Als laatste een tip als je een bepaald keyword niet kan vinden. Zoek in de ObjectBrowser (F2) naar een keyword en kijk hoe die aangeroepen moet worden. Wat ook handig is, is om te zoeken in References. Dit kan door in het code venster op ALT+F12 te drukken, hiermee zoek je niet alleen in je code maar ook in de Assembly referenties. 

Laat a.u.b. commentaar achter als je vragen of opmerkingen hebt. Vraag mij ook gerust naar een .NET variant als ik deze niet genoemd hebt. 

-Arjan van Huizen-


 

Nieuwsbrief

Blijf op de hoogte van alles wat op VBcentral gebeurd. Meld je nu aan voor onze nieuwsbrief! »

Over ons

Wij zijn gek op het Microsoft .NET ontwikkelplatform en haar ontwikkeltalen, maar we hebben een sterke voorkeur voor Visual Basic .NET! »

Neem contact op

VBcentral.nl
Bataafseweg 20
7101 PA Winterswijk
Nederland
+31 (543) 538 388
info@vbcentral.nl