C# til VB - lidt hjælp til konvertitter

by DotNetNerd 10. March 2007 16:11

C# til VB - lidt hjælp til konvertitter

Da jeg skal til at arbejde med VB har jeg brugt lidt tid på at bore i forskellene imellem C# og VB. Det har vist sig at der er en række interessante forskelle, så jeg har derfor valgt at skrive denne artikel således at andre der skal til at skifte sprog eller eventuelt bare skal vælge sprog i det hele taget kan lade sig inspirere af mine opdagelser. Jeg forgiver på ingen måde at dette er et komplet opslagsværk over forskelle (da der allerede findes den slags lister), da det udelukkende er de ting jeg personligt mener man skal vide for at komme igang krydret med nogle af de ting jeg finder interessante.

De største forskelle imellem de to sprog ligger i syntaksen, men der er også enkelte features som er specifikke for de enkelte sprog - og så er der forskel på hvad visual studio har af funktionalitet til at støtte op om sprogene.

Struktur og syntaks forskelle

Det første man får øje på når man sammeligner sprogene er hvordan scope angives,og hvordan man afslutter en linie. C# benytter tuborgklammer til at angive scope, hvorimod der i VB er et reserveret ord (eller to om man vil) der angiver at en given konstruktion slutter. Afslutning af en linie i C# sker ved at man skriver et semikolon, og i VB skifter man bare linie så det er end of line karakteren der egentlig afslutter linien. Gode eksempler til at illustrere dette kan være at se på en enkel forgrening eller løkke konstruktion.


C#

if (myVar == 1 && yourVar == 2)
{
    //Do stuff
}

VB

If (myVar = 1 AndAlso yourVar = 2) Then
    'Do stuff
End If

Eksemplet illustrerer forskellen i angivelse af scope med henholdsvis klammer og et End nøgleord. Derudover kan man se at operatorer også er forskellige idet C# bruger en mere matematisk notationsform, hvor VB nærmere ligner engelsk.

C#

for (int index = 0; index<collection.Count; index++)
{
    //Do stuff
}

VB

For index As Integer = 0 To 8 Step 2
    'Do stuff
Next index

Forløkken adskiller sig mere rent rent syntaktisk, da det igen er tydeligt at notationsformen i C# er mere matematisk hvor VB søger at ligne engelsk. En detalje der er værd at bemærke er at incrementering og decrementering i C# kan gøres ved hjælp af shorthand notation som ++ og -- hvilket ikke findes i VB. Andre syntaktiske forskelle er instantiering af objekter, brug af indexere og generics. Disse ting er hurtigst og bedst illustreret ved et lille eksempel.

C#

string navn = "";
myHashTable["Hans"]
List myList;

VB

Dim navn AS string = ""
myHashTable("Hans")
myList as List(Of Integer)

Parameter passing er endnu et sted hvor sprogene adskiller sig markant idet C# passer simple typer by value og komplekse typer by reference. I VB er alt derimod passed by reference med mindre man angiver det med nøgleordet ByVal.

Og en sidste lille detalje til det her afsnit er conditional statements hvor man i C# laver en ?: konstruktion findes der i VB en IF funktion.

C#

int i = obj==null?0:(int)obj;

VB

Dim i As Integer = IF(obj IS Nothing, 0, DirectCast(obj, Integer))
Klasse og metode signaturer

Omkring signaturer er den mest markante forskel ved angivelse af returntypes, men der er også enkelte modifiers der hedder noget forskelligt. I C# angiver man hvad de returnerer og void hvis de ikke returnerer noget. I VB derimod angiver man en Sub hvis der ikke returneres noget og ellers angives en Function.
Metode der ikke returnerer noget:

C#

void DoStuff()
{
    //Do stuff
}

VB

Sub()
    'Do stuff
End Sub

Metode der returnerer en string:

C#

string DoStuff()
{
    return "Hello world";
}

VB

Function() As String
    return "Hello world"
End Function

Derudover består forskellen i navngivningen, idet ting der kun er synlige indenfor et assembly angives med henholdsvis internal og Friend, metoder der ikke kræver en instans af et objekt hedder static og Shared og man gemmer metoder med henholdsvis new og Shadow.

Type håndtering

En markant underliggende forskel på de to sprog ligger i håndteringen af typer. C# er meget stringent og kræver præcis angivelse af casts, hvorimod VB automatisk håndterer simpel typekonvertering. Syntaktisk foregår eksplicit casting heller ikke helt på samme måde som det fremgår af følgende eksempel.

C#

string s = (string)hash("Hans");

VB

Dim s As String = DirectCast(hash("Hans"), String)

Alternativt kan man i VB også bruge funktionerne CType der ligeledes kan bruges til casting eller en række specifikke funktioner som CInt, CDbl osv. Forskellen er at DirectCast egentlig er til casting og CType er til konverteringer.

Sprogspecifikke features

C# kan en større ting som ikke er muligt i VB og det er at afvikle unsafe kode. Derudover findes stiller Visual Studio nogle flere værktøjer til rådighed i forbindelse med udvikling. Der findes er menupunkt i VS som hjælper med refactoring af kode, og codesnippet delen er bygget samme med autocompletion i større grad end den er til VB.

VB tilgengæld har nogle sproglige ting der er med til at gøre koden mere læsevenlig og så er flere funktioner tilgængelige enten direkte eller via namespacet my. Jeg vil ikke gå nærmere ind i at liste disse funktioner men kan nævnet at f.eks matematiske udtryk kan bruges direkte som f.eks Rnd istedet for Math.Round

With nøgleordet giver mulighed for at sætte flere attributter på samme objekt uden at gentage handle navnet på følgende måde.

C#

kunde.Navn = "Per Petersen";
kunde.Adresse = "Odensevej 321";
kunde.Telefon = "12345678";

VB

With kunde
    .Navn = "Per Petersen"
    .Adresse = "Odensevej 321"
    .Telefon = "12345678"  
End With
Event håndtering

Som en afsluttende detalje vil jeg nævne eventhåndtering, som kan gøres på samme måde - hvis man ser bort fra syntaks. VB giver dog mulighed for at man kan erklære at en metode skal håndtere et bestemt event frem for at man skal skrive det i kode. Først lad os se et basalt eksempel på eventhåndtering.
C#

public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
public event AlarmEventHandler Alarm;  

...

if (chocolateInStock < 10)
{
    AlarmEventArgs e;
    ...
    Alarm(this, e);
}

VB

Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
Public Event Alarm As AlarmEventHandler
...
If (chocolateInStock < 10) Then
    Dim e as AlarmEventArgs
    ...
    RaiseEvent Alarm(Me, e)
End If

Som det fremgår virker tilføjelsen af en event handler meget ens på de to sprog. VB tillader imidlertid at man gør følgende som ikke er muligt i C#.

    Private WithEvents chokoManager As ChokoladeManager
    Sub Handler1(e As AlarmEventArgs) Handles chokoManager.Alarm
        '*** handler method implementation
    End Sub

Alternativet som ses her er dog muligt i begge sprog.

C#

clock.Alarm += new AlarmEventHandler(OnAlarmRang);

VB

AddHandler clock.Alarm, AddressOf OnAlarmRang

Konklusion

Bevæbnet til tænderne med denne artikel og med google klar i baghånden skulle det være en form sag at komme igang med at skifte imellem C# og VB. Det håber jeg ihvertfald da jeg snart selv skal til og igang med det for alvor.

Jeg vil lade helt værd med at gå ind i en diskussion om hvilket sprog der er "bedst" for det vil altid være enormt subjektivt, og i sidste ende er det også irrelevant. Det interessante er bare at se hvad de to sprog tilbyder og så glæder jeg mig personligt til at stå i en situation hvor jeg kan hoppe imellem de to sprog uden nærmere omtanke.

Tags: , ,

Who am I?

My name is Christian Holm Diget, and I work as an independent consultant, in Denmark, where I write code, give advice on architecture and help with training. On the side I get to do a bit of speaking and help with miscellaneous community events.

Some of my primary focus areas are code quality, programming languages and using new technologies to provide value.

Microsoft Certified Professional Developer

Microsoft Most Valuable Professional

Month List