vNext features i C# og VB

by DotNetNerd 30. October 2008 22:09

Den seneste måned er der begyndt at blive talt om nye features i næste version af kernesprogene i .NET. Personligt er jeg glad for at der er nogen features der idag kun eksisterer i et af sprogene der bliver portet så de findes i begge sprog. Her er der umiddelbart tale om optionel arguments der kommer til C# og automated properties til VB. Begge features er små forbedringer, men nogen man indimellem savner når man, som mig, springer lidt imellem sprogene.

Udover denne synkronisering af sprogene kommer der naturligvis også helt nye tiltag. Herunder named parameters som man kender det fra blandt andet F#, og den mest omtalte feature som er dynamisk bundne metodekald. Sidstnævnte gør det muligt at deklarere et objekt med keywordet dynamic hvorefter man kan kalde metoder på det, som først bliver resolved på afviklingstidspunktet. Det gør det meget enklere at skrive kode som idag vil kræve brug af reflections Method.Invoke eller DynamicMethod.

For at se eksempler og læse mere kan du kigge her hvor Justin Etheredge laver en sammeligning af performance i forhold til reflection baserede løsninger.

Tags: ,

Dynamic Language Runtime

by DotNetNerd 3. November 2007 23:36

DLR - Dynamic Language Runtime.

Jeg fik for et stykke tid siden øje på en blogpost der omhandlede endnu et tiltag Microsoft arbejder på til .NET frameworket - nemlig en Dynamic Language Runtime. Umiddelbart tænkte jeg "fint nok men hvad skal jeg bruge det til". Det spørgsmål fik jeg så besvaret nu her da jeg faldt over en video fra MIX07 omkring dette emne. Jeg vender tilbage til videoen senere, da den indeholdt et temmeligt fedt eksempel som jeg vil gengive.

Kort fortalt er styrken ved dynamiske sprog at de "bare er tekst" ligesom en aspx- eller xaml-fil. Derved giver de nogle muligheder for især webudviklere ved egentlig at vende en smule tilbage til webudviklingens barndom. Idet sprogene er fortolkede, og altså "bare tekst" der ikke skal kompileres for at kunne afvikles, kan man arbejde uden konstant at skulle igennem en code-compile-review cyklus.

Dette kan især være rart hvis man skal udgive rettelser til en webapplikation, men også under selve udviklingen da man kan sidde med browseren fremme på den ene skærm imens man retter i koden på den anden og ser ændringerne slå igennem med det samme.

Hvilke sprog kan man så kode i?

Til at at starte med arbejder Microsoft på at udvikle implementationer baseret på sprogene:

  • IronRuby
  • IronPython
  • JavaScript
  • Dynamic VB

Ligesom med den almindelige CLR er det meningen at det skal være muligt at udvide med flere sprog hen ad vejen. De 4 sprog der er med til at starte med er valgt ud fra at de for det første er meget udbredte, og så for JavaScripts vedkomne fordi det giver mulighed for at man meget let kan genanvende sine eksisterende Ajax scripts i f.eks en Silverlight applikation. VB er som altid representeret af hensyn til Microsofts eget Office team. IronRuby og IronPython er enormt populære sprog der er svære at komme uden om - og de har en force i at de begge har en lækker syntaks der er meget lidt verbos.

Mix and Match

Der før omtalte eksempel fra MIX07 synes jeg gav en virkelig god idé om hvilke muligheder der vil være for at lege "Mix and Match" i fremtiden, da det illustrerer hvor enkelt man kan blande forskellige sprog - hvad end det er CLR eller DLR sprog, og hvad enten det er ASP, Silverlight eller helt almindelig HTML.

Eksemplet er en Silverlight applikation skrevet i Ruby og benytter en knap skrevet i C#, som kører et animationsscript skrevet i DLR JavaScript der viser tekstelementer der floater rundt. Teksterne er hentet fra en service skrevet i VB, udfra et ord der er indtastet i en HTML textbox som tilgås via Silverlights HTML DOM.

require 'Silverlight.Samples.Controls.Version=0.0.0.0'

Controls = Silverlignt.Samples.Controls
Document = System.Windows.Browser.HtmlPage.Document

JS = require '3dText.js'
VB = require 'technorati.vbx'

def initialize(s, e)
    button = Controls.Button.new
    button.Text = "Click me"

    JS.initialize

    root.children.add button

    button.click do |s, e|
        JS.clearList
        term = Document.txtSearchTerm.Value
        items = VB.GetTitles(term)
        items.each { |item| JS.initializeName(item)}
        JS.playAnimation
    end
end

Som man kan se er Ruby meget letvægts, og hvis man tænker over antallet af komponenter skrevet i forskellige sprog fra forskellige miljøer der arbejder sammen her kan man ikke undgå at blive lidt imponeret over hvor smertefrit CLR og DLR sprog taler sammen.

Det er værd at bide mærke i de første 5 linier fra eksemplet hvor man ser hvor let det er at importerer komponenter fra serveren, samt at referere til dynamisk kode skrevet i andre sprog. Det er ganske enkelt bare at bruge en simpel require statement.

Derefter viser eksemplet en initialize metode, som det er defineret i den tilhørende XAML fil skal kaldes ved init. I initialize instantieres så en knap, og en tilsvarende initialize metode på JavaScript komponenten kaldes. Knappen tilføjes så til et canvas der er navngivet root. Knappen for derefter tildelt en anonym eventhandler, der clearer den liste af tekster og tilføjer nye ord hentet fra VB servicen. Til sidst er det blot at starte animationen og så er koden kørende.

Hvordan platformen blev til.

En sjov historie fra videoen er at en af dem der har været med til at lave det oprindeligt startede med at ville skrive en artikel for at lave grin med Microsoft, da han havde hørt at .NET var elendigt at bygge dynamiske sprog oven på.
Han skrev så en implementation af Python oven på CLR'en - og til hans store overraskelse sparkede den røv på den originale Python. Med andre ord viste benchmarks at hans implementation performede dobbelt så godt! Derefter endte han så med at arbejde for Microsoft og har været med til at bygge denne platform til at hoste dynamiske sprog.

.NET 3.5 og Visual Studio 2008

by DotNetNerd 15. April 2007 16:26

Vistual Studio 2008.

Jeg har kigget på den nye udgave af Visual Studio 2008 der efter planen skal udkomme engang i løber af anden halvdel af 2007. VS2008 shippes med en del features som enhver udvikler har savnet tidligere, samtidig med det er udviklet til at arbejde med den nye .NET 3.5 framework der udgives ved sammen lejlighed.

I kategorien af features som har været savnet kan jeg nævne at VS2008 giver mulighed med at arbejde med alle tidligere udgaver af frameworket tilbage til 2.0, således at man ikke skal have de "gamle" udgaver af Visual Studio installeret blot for at kunne vedligeholde et eksisterende projekt. En ekstra bonus i den sammenhæng er at man derved kan bruge de forbedrede debugging værktøjer når man f.eks arbejder med et .NET 2.0 projekt.

Udover bagudkompatibilitet er der kommet intellisence og debugging funktionalitet til JavaScript (herunder også Ajax). Det er ihvertfald en ting jeg selv har savnet i lang tid, så man kan komme væk fra at debugge via alert statements, og man slipper for at sidde og ærge sig over at man ikke kan huske hvad en member hedder. Til brug sammen med javascript er der udviklet nye xmlkommentar standarder der passer til beskrivelse af ting der er javascript specifikke.

Sidst men ikke mindst kan jeg nævne at der naturligvis også kommer en række værktøjer til at understøtte .NET 3.0 - hvor især et tool ved navn Cider til at arbejde med XAML til Windows Presentation Foundation virker interessant. Samarbejdet med andre applikationer som for eksempel Expression Studio skulle også være noget der etr tænkt meget over, så der er uden tvivl nogle interessante ting i vente der også.

.NET 3.5 - whats new?!.

Det helt store samtale emne omkring .NET 3.5 har været LINQ som står for Language Integrated Query. Idéen med LINQ er at gøre det lettere at arbejde med data - noget som vores egen Anders Hejlsberg har været en af de store bagmænd til. Udover og i forbindelse med udviklingen af LINQ kommer der også en række udvidelser til både C# og VB som nu udkommer i versionerne C# 3.0 og VB 9.

Både C# og VB udvides med extention methods samt object- og collection initializers. Begge sprog får også nogle sprogspecifikke udvidelser, som for C# inkluderer automatic properties og mulighed for implicit typespecifik deklarering.

C# 3.0 og VB 9 udvidelser.

Som sagt udvides begge sprog med det der kaldes extention methods, object- og collection initializers.

Extention methods er en måde hvorpå man kan tilføje metoder til en type, som bedst er illustreret med et lille eksempel. Hvis du idag skal checke om en streng validerer som en gyldig email vil du typisk lave en metode på en anden klasse der kan lave valideringen. Med extention methods kan du istedet føje metoden til string således at du kan skrive:

if (txtEmail.IsValidEmail)
{
   
}

Det eneste det kræver er at du definerer en statisk klasse, med din metode der tager typen der skal udvides som parameter og bruger keywordet "this" foran.

public static class MyExtensions
{
    public static bool IsValidEmail(this string s)
    {
        Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
        return regex.IsMatch(s);
    }
}


Når der er gjort kan du blot importere klassen ved hjælp af en using statement og så er metoden tilgængelig på typen string.

using MyExtentions;

Object initializers er en mere elegant måde at initialisere et objekt på, således at instantiering og tildeling af værdier til properties gøres mere kompakt. Igen er det nok bedst illustreret ved et kort eksempel

Customer customer = new Customer { Name = "Allan", City = "Nyborg" };

På samme vis giver collection initializers mulighed for at skabe collections og fylde dem på en mere kompakt måde.

List<Customer> customers = new List<Customer>()
{
    new Customer{Name = "Allan", City = "Nyborg"},
    new Customer{Name = "Lena", City = "Hundslev"}
};


Sprogspecifikke udvidelser.

Som tidligere nævnt er der også kommet nogle sprogspecifikke udvidelser til både C# og VB. Til C# er der tale om automatic properties og så et nyt keyword "var".

Automatic properties går at man kan deklarere properties uden at skulle have en underliggende private member til at holde værdien. Naturligvis skal der stadig være noget til at holde værdien, men dette er nu håndterert af compileren så det er muligt at deklarere en property blot ved at skrive:

public string Name
{
    get;
    set;
}


Var keywordet er en udvidelse der grunder i at LINQ syntaksen skal have mulighed for at man implicit kan lave en variabel der alligevel har den rigtige type og ikke blot er af typen object.

var customer = new Customer { Name = "Allan", City = "Nyborg" };

Kort fortalt vil det sige at ovenstående "customer" handle har fat i et objekt af typen Customer, de typen udledes automatisk.

VB får den samme mulighed, men dog uden et nyt keyword da sproget allerede idag har keywordet Dim - objekter bliver frem over bare instantieret med den rigtige tyåe frem for som object selvom man ikke skriver "As Customer".

En anden smart feature der kommer til VB er muligheden for at arbejde med XML inline i koden, således at man kan skrive:

XElement element = <customer>
                                  <name>Christian</name>
                                  <city>Odense</city>
                              </customer>

LINQ - en ny måde at arbejde med data.

Det absolut mest omtalte emne i forbindelse med .NET 3.5 har været LINQ. Da dette er et større emne gemmer jeg det til en seperat artikel, men jeg kan dog lige nævne kort at LINQ er en ny måde at arbejde med data på hvad enten det skal hentes fra en database, et xml dokument eller fra nogle objekter i memory.

Idéen er at lave en fælles syntaks til at definere funktioner der kan bearbejde data på en måde der i nogen grad minder om SQL. Derved slipper man for at skulle arbejde på en forskellig måde alt efter om man arbejder med en sql, xml eller hvad det nu kan være, og samtidig arbejder man med typestærke og extensible objekter - frem for querys der er definerede som strenge.

Tags: , , ,

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

bedava tv izle