How to calculate 30% Commission using DIM operator?

Dim i VB: Mere end blot en variabel

25/12/2015

Rating: 4.84 (8871 votes)

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.

What does dim mean in VB?
One way to look at the power of VB's Dim operator is to say, Dim kind of means, "I want to declare a variable but I can't tell you much about how it behaves until much later." Dim lets you do actual late-binding while in C# (today) you do late-binding with reflection. I wanted to find a way to clearly express this in a very visceral sample.
Indholdsfortegnelse

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() Next

Bemæ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

OperatorDansk NavnBeskrivelseEksempel
+AdditionLægger to tal sammen.7 + 2 giver 9
-SubtraktionTrækker et tal fra et andet.7 - 2 giver 5
*MultiplikationGanger to tal.7 * 2 giver 14
/DivisionDividerer to tal (resultat er flydende-komma).7 / 2 giver 3.5
\HeltalsdivisionDividerer to tal og returnerer kun heltalsdelen.7 \ 2 giver 3
ModModuloReturnerer resten efter en division.7 Mod 2 giver 1
^EksponentieringOpløfter et tal i en potens.7 ^ 2 giver 49
&StrengsammensætningSæ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. var i C# er en genvej til statisk typebestemmelse ved kompileringstid. Dim i 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 typen Object. Dette giver fleksibilitet, men kan føre til lavere ydeevne og potentielle fejl ved kørselstid. At bruge Option Strict On i 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 kun v3, der bliver erklæret som String. v1 og v2 bliver 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.

Go up