25/12/2015
Når man ser C#'s 'var'-operator, der bruges til implicit typede variabler, er det let at drage en hurtig konklusion: "Åh, nu har C# også Dim." Men den sammenligning er ikke helt præcis. Faktisk er den langt fra. Mens 'var' i C# primært er en bekvemmelighed for udvikleren – en måde at sige, "Jeg vil erklære en variabel, men jeg er for doven til at skrive dens type ud" – så har 'Dim' i Visual Basic en dybere og mere fleksibel betydning. Man kan se 'Dim' som en erklæring, der siger: "Jeg vil erklære en variabel, men jeg kan ikke fortælle dig præcis, hvordan den opfører sig, før meget senere." Denne evne til sen binding (late-binding) er, hvor VB.NET virkelig skinner igennem, især i scenarier, der involverer COM-interaktioner, som f.eks. Office-automatisering.

Dim vs. var: En Grundlæggende Forskel
Forskellen ligger i, hvornår typen af en variabel bestemmes. Med var i C# bestemmes typen ved kompileringstidspunktet. Compileren ser på, hvad du tildeler variablen, og fastlåser typen med det samme. Den er statisk og sikker.
Med Dim i Visual Basic, især når Option Strict er slået fra, kan variablen være af typen Object. Dette giver mulighed for, at medlemmer (metoder, egenskaber) af objektet kan kaldes dynamisk ved kørselstid. Hvis du i C# har brug for at opnå den samme dynamiske adfærd, skal du ty til et meget mere komplekst og omstændeligt værktøj: Reflection. At løse et problem med Reflection kan ofte føles som at åbne en dør med en forhammer – det virker, men det er sjældent elegant og kan introducere nye problemer.
Praktisk Eksempel: Office Automatisering med Sen Binding
Lad os se på et konkret eksempel for at illustrere styrken ved VB's Dim. Forestil dig, at du skal ændre en brugerdefineret egenskab (Custom Document Property) i et Word-dokument og derefter opdatere et felt i dokumentet, der viser denne egenskab. Dette er en almindelig opgave i applikationer, der genererer rapporter eller udfylder skabeloner.
Tilgangen i C# (med Reflection)
I C# bliver denne opgave hurtigt kompliceret. Fordi de specifikke COM-interfaces, der er nødvendige for at tilgå CustomDocumentProperties, er sent bundne IDispatch-interfaces, kan man ikke bare tilgå dem direkte. Man er tvunget til at bruge Reflection. Koden bliver fyldt med object-typer, System.Reflection.Missing.Value, og man skal skrive brugerdefinerede hjælpefunktioner, der bruger InvokeMember til at hente og sætte værdier. Resultatet er en kode, der er svær at læse, svær at vedligeholde og fyldt med strenge-literaler, der let kan indeholde stavefejl.
Den Elegante Løsning i VB.NET
Nu ser vi på den samme opgave løst i Visual Basic. Forskellen er som nat og dag. Takket være VB's indbyggede understøttelse af sen binding, kan vi interagere med Word's COM-objekt, som var det et almindeligt .NET-objekt. Koden er ren, kortfattet og intuitiv.
I VB kan du simpelthen skrive:
' Antager at aDoc er en reference til Word-dokumentet Dim PROP = "CustomProperty1" ' Hent værdien Dim propertyValue = aDoc.CustomDocumentProperties(PROP).Value ' Sæt en ny værdi aDoc.CustomDocumentProperties(PROP).Value = "Hanselman" ' Opdater felter i dokumentet For Each r As Range In aDoc.StoryRanges r.Fields.Update() NextBemærk fraværet af Reflection. Ingen InvokeMember, ingen Missing.Value. Det "virker bare". Dette skyldes, at Dim tillader os at arbejde med objekter, hvis fulde interface ikke er kendt ved kompileringstidspunktet. Dette er et perfekt eksempel på at vælge det rigtige værktøj til opgaven. Selvom du KAN løse problemet i C#, betyder det ikke altid, at du BØR.
Dim i Hverdagen: Simple Aritmetiske Operationer
Selvom Dim er kraftfuld til komplekse opgaver, er dens primære funktion stadig simpel variabelerklæring til dagligdags opgaver. Lad os se på et simpelt eksempel, hvor vi beregner 30% kommission af et salg.
Dim Commission As Single Dim Sales As Single Sales = 3142.51 Commission = 0.3 * Sales ' Beregner 30% kommission.Her bruges Dim til at oprette to variabler, Commission og Sales, af typen Single (en flydende-komma taltype). Koden er let at læse og forstå. Visual Basic understøtter en række standard aritmetiske operatorer, som er essentielle for sådanne beregninger.
Oversigt over Aritmetiske Operatorer i VB.NET
| Operator | Dansk Navn | Beskrivelse | Eksempel |
|---|---|---|---|
| + | Addition | Lægger to tal sammen. | 7 + 2 giver 9 |
| - | Subtraktion | Trækker et tal fra et andet. | 7 - 2 giver 5 |
| * | Multiplikation | Ganger to tal. | 7 * 2 giver 14 |
| / | Division | Dividerer to tal (resultat er flydende-komma). | 7 / 2 giver 3.5 |
| \ | Heltalsdivision | Dividerer to tal og returnerer kun heltalsdelen. | 7 \ 2 giver 3 |
| Mod | Modulo | Returnerer resten efter en division. | 7 Mod 2 giver 1 |
| ^ | Eksponentiering | Opløfter et tal i en potens. | 7 ^ 2 giver 49 |
| & | Strengsammensætning | Sætter to strenge sammen. | "Hej" & " Verden" giver "Hej Verden" |
Lokal vs. Global: Dim's Rækkevidde
En vigtig ting at forstå om Dim er dens rækkevidde (scope). Dim bruges til at erklære lokale variabler. Det betyder, at en variabel erklæret med Dim inde i en subrutine eller funktion kun eksisterer og kan tilgås inden for den pågældende subrutine eller funktion. Når koden forlader denne blok, ophører variablen med at eksistere.
Hvis du har brug for en variabel, der er tilgængelig på tværs af flere subrutiner eller endda hele modulet eller applikationen, skal du bruge andre nøgleord. Globale variabler erklæres med nøgleord som Public, Private eller det ældre Global. Valget afhænger af, hvor bred en tilgængelighed variablen skal have.
Dim: Bruges for variabler med lokal rækkevidde (inde i en funktion/subrutine).Private: Bruges for variabler, der er tilgængelige for alle funktioner/subrutiner inden for samme modul eller klasse.Public: Bruges for variabler, der er tilgængelige fra hele projektet.
Dim kan også bruges til at erklære arrays, som er lister eller tabeller af data. For eksempel opretter Dim navne(10) As String et array, der kan indeholde 11 strenge (indekseret fra 0 til 10).
Ofte Stillede Spørgsmål (FAQ)
- Er `Dim` det samme som `var` i C#?
- Nej.
vari C# er en genvej til statisk typebestemmelse ved kompileringstid.Dimi VB kan bruges til både statisk typebestemmelse (f.eks.Dim x As Integer) og til at muliggøre dynamisk sen binding (f.eks.Dim x As Object), hvilket er en fundamental forskel i funktionalitet. - Skal jeg altid specificere en type, når jeg bruger `Dim`?
- Det er stærkt anbefalet. Hvis du ikke angiver en type (f.eks.
Dim minVariabel), vil den som standard blive af typenObject. Dette giver fleksibilitet, men kan føre til lavere ydeevne og potentielle fejl ved kørselstid. At brugeOption Strict Oni starten af dine filer tvinger dig til at specificere en type, hvilket fører til mere robust kode. - Hvorfor er VB bedre til COM-automatisering end C# (i ældre versioner)?
- VB's designfilosofi har historisk set omfavnet dynamiske scenarier og sen binding. Dette passer perfekt med mange COM-interfaces, som er designet til at blive tilgået dynamisk. C# var oprindeligt designet med et stærkere fokus på statisk typning, hvilket gjorde interaktion med disse COM-objekter mere besværlig og krævede manuel brug af Reflection. Nyere versioner af C# (4.0 og frem) har introduceret
dynamic-nøgleordet, som har gjort denne type arbejde meget lettere og mere lig VB's tilgang. - Kan jeg erklære flere variabler på én linje med `Dim`?
- Ja, men vær opmærksom på en klassisk faldgrube. Hvis du skriver
Dim v1, v2, v3 As String, er det kunv3, der bliver erklæret somString.v1ogv2bliver standardtypen (Object). For at erklære alle som strenge, skal du skrive:Dim v1 As String, v2 As String, v3 As String.
Hvis du vil læse andre artikler, der ligner Dim i VB: Mere end blot en variabel, kan du besøge kategorien Sundhed.
