Datatyper i .net
Förord
Att hantera datatyper är något som programmeraren inom ”klassisk ASP” anser sig har varit förskonad ifrån eller kanske du är som jag var och ville ha datatyper.Innehåll
»»
»
»
»
»
»
»
»
»
»
»
»
»
Relaterade artiklar
» Scope i .NETKanske du som jag skrev såhär bara för att vara säker på att saker skulle fungera:
Att använda datatyper brukar kallas för ”Strong Typing” på microsoftska. Jag brukar kalla det stabilare kod och ibland också snabbare kod. För att kunna hantera din kod på ett effektivare sätt så vill kompilatorn i .NET gärna veta vilken typ av data den ska hantera variabler som.
Innan jag försöker gå igenom vad olika datatyper är och innebär så vill jag bara ta upp detta begrepp. Begreppet innebär ungefär att du, när du omvandlar datatyper inte får tappa något innehåll på ett sätt som inte kan kontrolleras.
Om du tar ett decimaltal och vill omvandla det till ett heltal (0,5 till 1) så kommer det att tappa i exakthet. Option Strict säger att det inte är tillåtet rakt av. Du måste tala om för kompilatorn att du faktiskt vill göra just detta.
Jag kommer ta upp mer kring detta senare men jag vill påpeka att all min kod i exempel förutsätter att du har ”slagit på” Option Strict. Det gör du enklast genom att längst upp i din kod skriva ”Option Strict On”. Kompilatorn varnar då innan du gör något dumt.
All kod är dessutom författad i VB.NET och skrivet med ASP.NET i åtanke. All kod är skriven för ”code behind”.
När du deklarerar en variabel i .NET så måste du alltid ange datatyp. Vilken datatyp du väljer beror helt på vad du vill att din variabel ska innehålla.
Efter dessa tre rader har du tre olika variabler som i tur och ordning kan innehålla; heltal, text respektive vad som helst (jämför med Variant du som vet vad det är).
Det som gör att du bör välja en viss datatyp är dess respektive tillgångar och begränsningar. Ju mer komplett datatyp, desto större minnesåtgång och i vissa fall dessutom en upp till tio gånger långsammare kod. För att skilja olika datatyper åt har du dels ett namn men också det som brukar kallas max- och minvärden. Det är helt enkelt de yttre gränserna för respektive datatyp.
Man kan dela upp dessa typer i två olika undergrupper: heltal och decimaltal (eller flyttal). Det som skiljer dem åt är att den ena klarar inte av decimaltecken och den andra gör det.
Följande heltalstyper står dig till buds.
En liten snabb jämförelse med VB6 är att de tre sista typerna ”hoppat ner” ett snäpp och därigenom är Long numera just väldigt lång.
En kommentar som en annan medlem har givit är "Jag har för mig att man inte ”ska” använda Integer och de andra utan istället int32,int64 som ska vara mera .net", och det stämmer naturligtvis. Det finns en uppsättning alias för alla datatyper inom heltalen eftersom man gärna vill att alla datatyper ska ha samma namn i olika språk. Detta är dock enligt min mening bara att tänka på om du arbetar i ett projekt med en uppblandning av de olika språken i .NET.
Följande flyttalstyper finns:
Här handlar det som synes inte så mycket om hur stora eller små talen ska vara utan snarare hur många decimaler du vill ha. Personligen brukar jag hålla mig till double eftersom många uträkningar görs med just detta.
I .NET finns ännu ingen risk för att Y2K ska upprepas på ett tag. Snarare kan ett Y10K bli ett faktum. Datum heter i .NET DateTime. Tidräkningen börjar den 1/1 år 1 klockan 24 och slutar den siste december 9999 klockan 23:59:59 (pip). En sak som jag lagt märke till är att det inte finns någon typ för enbart tid eller enbart datum. Ett problem man snabbt vänjer sig vid dock.
Sen följer ett par olika typer som liksom hamnar lite vid sidan av.
Boolean är en datatyp som bara kan innehålla två värden, nämligen sant eller falskt. Trots att man då kanske skulle klara sig med en bit (8 bitar är en byte) i utrymme tar denna datatyp hela 4 bytes.
Char är en datatyp som hanterar bokstäver istället för siffror. Denna synnerligen begränsade datatyp kan bara hålla en enda bokstav.
De tidigare datatyperna var så kallade ”value types”. Det innebär att de faktiskt rakt upp och ner innehåller det som de säger. Nästa huvudtyp är så kallade ”reference types”. Det innebär att de egentligen bara innehåller en minnesadress till den plats där värdet finns. Till somligas förvåning hör faktiskt string dit och det kan jag hålla med om eftersom den faktiskt beter sig som en value type. Men rätt ska vara rätt.
String är nästa datatyp som jag vill ta upp eftersom den egentligen är lite speciell. Kort och gott kan man säga att den är en datatyp som kan hålla flera bokstäver. Om man är lite sån skulle man kunna säga att det är en array av char. Den stora grejen med String är att den fr o m nu klarar av Unicode, så nu kan du lagra allt möjligt i textform i dina strängvariabler. Runor och kilskrift inkluderat. Datatypen är dock ganska stor; hela 10 byte + 2 * strängens längd. Strängen ”Pellesoft” är med andra ord 28 byte lång.
Sist men inte minst har vi typen object. Denna typ är egentligen bara en liten behållare för den minnesadress som är aktuell för det objekt som den håller. Typen är 4 bytes lång och kan innehålla vad som helst av ovanstående. Naturligtvis blir den då längre eftersom innehållet också måste finnas. Denna typ använder du när du skapar instanser av klasser, som du antingen själv skapat eller som redan finns i .NET Framework.
Precis som förr så kan du naturligtvis tilldela en variabel ett värde och du gör fortfarande på samma sätt men nu finns det ett par varianter samt några undantag att ha i huvudet.
Förr deklarerade du en variabel och sen tilldelade du den ett värde. I vissa språk var du tvungen att göra det för att det inte skulle krascha. I VB och ASP så hade varje typ ett startvärde (eller defaultvärde). Det finns fortfarande men du kan nu ändra det redan i deklarationen.
Kanske en inte helt lyckad översättning av ”trailing character”. Meningen är dock att ibland så måste du tala om för kompilatorn att ett visst värde är av en viss typ. Detta gör du med typens tillhörande tecken. För de som är lite äldre så kanske de minns att man kunde skriva:
Det påminner lite om det.
För olika typer finns olika tecken. Eftersom Option Strict är på så kommer kompilatorn att varna långt innan det blir ett problem. Jag hänvisar till hjälpen för andra tecken än det i exemplet.
Genom att du kan använda initialisering kan du nu göra tilldelningar på ganska sjuka sätt och därigenom minska antalet rader. Du kan t ex tilldela din variabel resultatet av en funktion:
I mer extrema fall kan du tilldela variabeln resultatet av en funktion i en klass som i samtidigt skapas och dör.
Om du har programmerat ASP är detta ingen nyhet och det fanns som variant i VB men nu är det fullt utbyggt så att alla programmerare kan känna igen sig. Tänk dig att du ska ha flera variabler av samma typ. Då kan du deklarera dem såhär:
Men numera kan du också skriva såhär:
Det sparar plats och skapar en mer överskådlig kod.
Nackdelen med de senare är att det inte kan kombineras men initialisering.
Utan att gå för långt in i objektorientering och arv och sånt så kan jag försöka förklara rubriken. I grunden av .NET finns klassbiblioteket System. Under System ligger det mest grundläggande inom programmeringen. Där finns t ex alla datatyper.
I System finns också typen Object, vilken ligger till grund för alla datatyper. Genom det kommer också datatyperna till viss del att behandlas som klasser och alla som sysslat lite med sådan vet att det kan finnas metoder och egenskaper (properties) på klasser. Det finns faktiskt på datatyperna också. Grundläggade metoder kommer från Object men olika datatyper har olika metoder. Låt mig exemplifiera. Skriva följande i din kod:
Skriv sedan ”o.” på raden under och då kommer en lita på olika metoder fram. Se till att du hittar metoden ”ToString()”. Skriv därefter ”i.” och återigen får du en liten lista fast med fler metoder. Om du letar lite hittar du ”ToString()” igen. Integer ärver allstå av Object. Du ser också att det finns en hel del andra metoder under Integer, som MinValue eller Parse.
Strukturen i .NET är sådan och det finns inget att säga emot det ovanstående. Frågan kanske bara är vad du ska ha det till, eller hur? Det finns konkreta exempel även om de kanske inte alltid är så bra.
Variabeln s har nu värdet “10”.
Ett annat exempel återknyter till det som stod i början.
Variabeln "i" har nu ett värde som inte är en sträng utan ett heltal.
Ett lite bättre exempel för användning är stränghantering, något man aldrig kan få för mycket av.
Lägg märke till att metoden Replace finns på strängvariabeln.
Att använda de metoder som ligger på variablerna passar bättre in med det objektorienterade sätt på vilket .NET är uppbyggt och är en god vana att fortsätta med. Din kod kommer då se mer konsekvent ut och du kommer att ha lättare att läsa andras kod.
Nackdelen med att använda datatyper är de inte alltid vill stämma överens. Ett klart exempel har redan getts då ett usrID av typer Integer ska hämtas i en querystring som ju är en String. Då måste du typomvandla och dessutom göra det korrekt. På varje datatyp utom String och Object finns metoden Parse, som hjälper dig att omvandla. Det används i exemplet ovan. Det finns dock fler vägar att gå. Dels kan du använda alla gamla VB6 (och script) funktioner som CInt och CDbl men eftersom det inte stämmer med den vana jag tidigare talat om så bör du använda klassen Convert.
Denna klass kan omvandla alla ”value types” mellan varandra. Om du vill omvandla till en String så har du det ännu enklare eftersom alla objekt har metoden ToString(). Vad den gör beror på var den anropas men du får alltid tillbaka en sträng.
Detta kanske var en lite väl snabb genomgång av vad datatyper är och vad du ska använda dem till. Det är dock viktigt att påpeka att datatyper är viktigt och att du som programmerare i .NET måste acceptera dem och kunna dem.
Frågor och kommentarer kring artikeln mottages tacksamt via iMail eller mail. Adressen finns på mitt visitkort.
Dim usrID
usrID = Cint(request.Querystring(”usrID”))
Att använda datatyper brukar kallas för ”Strong Typing” på microsoftska. Jag brukar kalla det stabilare kod och ibland också snabbare kod. För att kunna hantera din kod på ett effektivare sätt så vill kompilatorn i .NET gärna veta vilken typ av data den ska hantera variabler som.
Option Strict On
Innan jag försöker gå igenom vad olika datatyper är och innebär så vill jag bara ta upp detta begrepp. Begreppet innebär ungefär att du, när du omvandlar datatyper inte får tappa något innehåll på ett sätt som inte kan kontrolleras.Om du tar ett decimaltal och vill omvandla det till ett heltal (0,5 till 1) så kommer det att tappa i exakthet. Option Strict säger att det inte är tillåtet rakt av. Du måste tala om för kompilatorn att du faktiskt vill göra just detta.
Jag kommer ta upp mer kring detta senare men jag vill påpeka att all min kod i exempel förutsätter att du har ”slagit på” Option Strict. Det gör du enklast genom att längst upp i din kod skriva ”Option Strict On”. Kompilatorn varnar då innan du gör något dumt.
All kod är dessutom författad i VB.NET och skrivet med ASP.NET i åtanke. All kod är skriven för ”code behind”.
Deklaration
När du deklarerar en variabel i .NET så måste du alltid ange datatyp. Vilken datatyp du väljer beror helt på vad du vill att din variabel ska innehålla.
Dim i As Integer
Dim s As String
Dim o As Object
Efter dessa tre rader har du tre olika variabler som i tur och ordning kan innehålla; heltal, text respektive vad som helst (jämför med Variant du som vet vad det är).
Det som gör att du bör välja en viss datatyp är dess respektive tillgångar och begränsningar. Ju mer komplett datatyp, desto större minnesåtgång och i vissa fall dessutom en upp till tio gånger långsammare kod. För att skilja olika datatyper åt har du dels ett namn men också det som brukar kallas max- och minvärden. Det är helt enkelt de yttre gränserna för respektive datatyp.
Numeriska datatyper
Man kan dela upp dessa typer i två olika undergrupper: heltal och decimaltal (eller flyttal). Det som skiljer dem åt är att den ena klarar inte av decimaltecken och den andra gör det.Följande heltalstyper står dig till buds.
Namn | Minvärde | Maxvärde | Storlek |
---|---|---|---|
Byte | 0 | 255 | 1 byte |
Short | -32768 | 32767 | 2 byte |
Integer | -2147483648 | 2147483647 | 4 byte |
Long | -92233+15 | 92233+15 | 8 byte |
En liten snabb jämförelse med VB6 är att de tre sista typerna ”hoppat ner” ett snäpp och därigenom är Long numera just väldigt lång.
En kommentar som en annan medlem har givit är "Jag har för mig att man inte ”ska” använda Integer och de andra utan istället int32,int64 som ska vara mera .net", och det stämmer naturligtvis. Det finns en uppsättning alias för alla datatyper inom heltalen eftersom man gärna vill att alla datatyper ska ha samma namn i olika språk. Detta är dock enligt min mening bara att tänka på om du arbetar i ett projekt med en uppblandning av de olika språken i .NET.
Följande flyttalstyper finns:
Namn | Minvärde | Maxvärde | Byte |
---|---|---|---|
Single | -3,402823E+38 | 3,402823E+38 | 4 |
Double | -1,7976E+318 | 1,7976E+318 | 8 |
Decimal | -792281E+23 | 79228162E+23 | 12 |
Här handlar det som synes inte så mycket om hur stora eller små talen ska vara utan snarare hur många decimaler du vill ha. Personligen brukar jag hålla mig till double eftersom många uträkningar görs med just detta.
Datum
I .NET finns ännu ingen risk för att Y2K ska upprepas på ett tag. Snarare kan ett Y10K bli ett faktum. Datum heter i .NET DateTime. Tidräkningen börjar den 1/1 år 1 klockan 24 och slutar den siste december 9999 klockan 23:59:59 (pip). En sak som jag lagt märke till är att det inte finns någon typ för enbart tid eller enbart datum. Ett problem man snabbt vänjer sig vid dock.
Andra
Sen följer ett par olika typer som liksom hamnar lite vid sidan av.Boolean är en datatyp som bara kan innehålla två värden, nämligen sant eller falskt. Trots att man då kanske skulle klara sig med en bit (8 bitar är en byte) i utrymme tar denna datatyp hela 4 bytes.
Char är en datatyp som hanterar bokstäver istället för siffror. Denna synnerligen begränsade datatyp kan bara hålla en enda bokstav.
Referenstyper
De tidigare datatyperna var så kallade ”value types”. Det innebär att de faktiskt rakt upp och ner innehåller det som de säger. Nästa huvudtyp är så kallade ”reference types”. Det innebär att de egentligen bara innehåller en minnesadress till den plats där värdet finns. Till somligas förvåning hör faktiskt string dit och det kan jag hålla med om eftersom den faktiskt beter sig som en value type. Men rätt ska vara rätt.String är nästa datatyp som jag vill ta upp eftersom den egentligen är lite speciell. Kort och gott kan man säga att den är en datatyp som kan hålla flera bokstäver. Om man är lite sån skulle man kunna säga att det är en array av char. Den stora grejen med String är att den fr o m nu klarar av Unicode, så nu kan du lagra allt möjligt i textform i dina strängvariabler. Runor och kilskrift inkluderat. Datatypen är dock ganska stor; hela 10 byte + 2 * strängens längd. Strängen ”Pellesoft” är med andra ord 28 byte lång.
Sist men inte minst har vi typen object. Denna typ är egentligen bara en liten behållare för den minnesadress som är aktuell för det objekt som den håller. Typen är 4 bytes lång och kan innehålla vad som helst av ovanstående. Naturligtvis blir den då längre eftersom innehållet också måste finnas. Denna typ använder du när du skapar instanser av klasser, som du antingen själv skapat eller som redan finns i .NET Framework.
Tilldelning
Precis som förr så kan du naturligtvis tilldela en variabel ett värde och du gör fortfarande på samma sätt men nu finns det ett par varianter samt några undantag att ha i huvudet.
Initialisering
Förr deklarerade du en variabel och sen tilldelade du den ett värde. I vissa språk var du tvungen att göra det för att det inte skulle krascha. I VB och ASP så hade varje typ ett startvärde (eller defaultvärde). Det finns fortfarande men du kan nu ändra det redan i deklarationen.
Dim i As Integer
i = 10
' Båda fungerar
Dim i As Integer = 10
Efterkommande tecken
Kanske en inte helt lyckad översättning av ”trailing character”. Meningen är dock att ibland så måste du tala om för kompilatorn att ett visst värde är av en viss typ. Detta gör du med typens tillhörande tecken. För de som är lite äldre så kanske de minns att man kunde skriva:
Dim a$
Det påminner lite om det.
' Generar fel
Dim dec As Decimal = 8.9
' Rätt
Dim dec As Decimal = 8.9@
För olika typer finns olika tecken. Eftersom Option Strict är på så kommer kompilatorn att varna långt innan det blir ett problem. Jag hänvisar till hjälpen för andra tecken än det i exemplet.
On the fly
Genom att du kan använda initialisering kan du nu göra tilldelningar på ganska sjuka sätt och därigenom minska antalet rader. Du kan t ex tilldela din variabel resultatet av en funktion:
Dim i As Integer = GetIntValue()
I mer extrema fall kan du tilldela variabeln resultatet av en funktion i en klass som i samtidigt skapas och dör.
Dim d As Double = New MyMoneyTools() _
.GetCurrency(Currency.SEK)
Multipla deklarationer
Om du har programmerat ASP är detta ingen nyhet och det fanns som variant i VB men nu är det fullt utbyggt så att alla programmerare kan känna igen sig. Tänk dig att du ska ha flera variabler av samma typ. Då kan du deklarera dem såhär:
Dim FNamn As String
Dim ENamn As String
Dim PNR As String
Dim UsrId As Integer
Dim Number As Integer
Men numera kan du också skriva såhär:
Dim FNamn, ENamn, PNR As String
Dim UsrId, Number As Integer
Det sparar plats och skapar en mer överskådlig kod.
Nackdelen med de senare är att det inte kan kombineras men initialisering.
Alla ärver av object
Utan att gå för långt in i objektorientering och arv och sånt så kan jag försöka förklara rubriken. I grunden av .NET finns klassbiblioteket System. Under System ligger det mest grundläggande inom programmeringen. Där finns t ex alla datatyper.
Dim i As System.Interger
Dim i As Integer
'Raderna ovan säger samma sak.
I System finns också typen Object, vilken ligger till grund för alla datatyper. Genom det kommer också datatyperna till viss del att behandlas som klasser och alla som sysslat lite med sådan vet att det kan finnas metoder och egenskaper (properties) på klasser. Det finns faktiskt på datatyperna också. Grundläggade metoder kommer från Object men olika datatyper har olika metoder. Låt mig exemplifiera. Skriva följande i din kod:
Dim o As Object
Dim i As Integer
Skriv sedan ”o.” på raden under och då kommer en lita på olika metoder fram. Se till att du hittar metoden ”ToString()”. Skriv därefter ”i.” och återigen får du en liten lista fast med fler metoder. Om du letar lite hittar du ”ToString()” igen. Integer ärver allstå av Object. Du ser också att det finns en hel del andra metoder under Integer, som MinValue eller Parse.
Strukturen i .NET är sådan och det finns inget att säga emot det ovanstående. Frågan kanske bara är vad du ska ha det till, eller hur? Det finns konkreta exempel även om de kanske inte alltid är så bra.
Dim i As Integer = 10
Dim s As String = i.ToString()
Variabeln s har nu värdet “10”.
Ett annat exempel återknyter till det som stod i början.
Dim i As Integer = _
Integer.Parse(Request.QueryString("usrID"))
Variabeln "i" har nu ett värde som inte är en sträng utan ett heltal.
Ett lite bättre exempel för användning är stränghantering, något man aldrig kan få för mycket av.
Dim s As String = "Pellesoft"
s = s.Replace("P", "L")
Lägg märke till att metoden Replace finns på strängvariabeln.
Att använda de metoder som ligger på variablerna passar bättre in med det objektorienterade sätt på vilket .NET är uppbyggt och är en god vana att fortsätta med. Din kod kommer då se mer konsekvent ut och du kommer att ha lättare att läsa andras kod.
Typomvandling
Nackdelen med att använda datatyper är de inte alltid vill stämma överens. Ett klart exempel har redan getts då ett usrID av typer Integer ska hämtas i en querystring som ju är en String. Då måste du typomvandla och dessutom göra det korrekt. På varje datatyp utom String och Object finns metoden Parse, som hjälper dig att omvandla. Det används i exemplet ovan. Det finns dock fler vägar att gå. Dels kan du använda alla gamla VB6 (och script) funktioner som CInt och CDbl men eftersom det inte stämmer med den vana jag tidigare talat om så bör du använda klassen Convert.
UsrId = Convert.ToInt32(Request.QueryString("usrID"))
Denna klass kan omvandla alla ”value types” mellan varandra. Om du vill omvandla till en String så har du det ännu enklare eftersom alla objekt har metoden ToString(). Vad den gör beror på var den anropas men du får alltid tillbaka en sträng.
Avslutning
Detta kanske var en lite väl snabb genomgång av vad datatyper är och vad du ska använda dem till. Det är dock viktigt att påpeka att datatyper är viktigt och att du som programmerare i .NET måste acceptera dem och kunna dem.Frågor och kommentarer kring artikeln mottages tacksamt via iMail eller mail. Adressen finns på mitt visitkort.
0 Kommentarer