Freitag, 16. April 2010

VB – Quo Vadis?

Ja ich gebe zu, ich mag VB.

Ich finde VB10 hat ein paar sehr nützliche Features. So sind z.B. in den meisten Fällen keine underscores (_) als sog. Line continuations mehr nötig.

Auch nett sind die collection initializer, die es momentan in C# in der Form nicht gibt.

Bisher mochte ich VB immer verteidigen, wenn es darum ging, ob VB schlechter ist als C#.

Doch mittlerweile kommen mir Zweifel. Das mag daran liegen, dass ich C# doch recht lieb gewonnen habe. Vielleicht aber auch daran, dass ich immer mehr F# Code schreibe und dessen Eleganz einfach umwerfend finde.

Der Grund warum mir Zweifel an VB kommen, folgender VB10 Code, den ich in einem Blog entdeckt habe.

Public Sub LoadPolicyDetail()

Dim client As New Services.Service1Client()


 

AddHandler client.GetPolicyDetailCompleted,

Sub(s As Object, e As GetPolicyDetailCompletedEventArgs)

If e.Result <> Nothing Then

MessageBox.Show("Awesome!")

End If

End Sub


 

client.GetPolicyDetailAsync()

End Sub


 

Dieser Code zeigt, wie man eine anonyme Methode an einen Event bindet. Hier der gleiche Code in C#


void LoadPolicyDetail()

{


var client = new
Service1Client();

client.GetPolicyDetailCompleted += (s,e) => if (e.Result != null) MessageBox.Show("Awesome!");


client.GetPolicyDetailAsync()

}


 

Dieser Code ist doch deutlich lesbarer. Statt 8 Zeilen Code und einer Menge "Rauschen" brauche ich mit C# nur 3 Zeilen. Gut man könnte den Code noch etwas formatieren, dann kommt man auf 5.

Ich verstehe nicht, welche Vorteile eine Programmiersprache bringen soll, für die man bei gleichem Ergebnis 3x so viel Code schreiben muss.


 


 


 

Kommentare:

Ramirez hat gesagt…

Das ist doch aber Äpfel mit Birnen vergleichen. Dein Herz scheint hier nur an der kürze zu liegen.

Wenn es nur darum geht:
Dim client As New Services.Service1Client()

AddHandler client.GetPolicyDetailCompleted, Sub(s, e) If e.Result IsNot Nothing Then MsgBox("Awesome!")

Da ist Dein Dreizeiler in VB.

Der adequate C# Code wär auch:
var client = new
Service1Client();

client.GetPolicyDetailCompleted += (object s, GetPolicyDetailCompletedEventArgs e) => {
if (e.Result != null) {
MessageBox.Show("Awesome!");
}
}

Schon gar nicht mal viel anders mehr?

WEnn ich jetzt noch die InteliSense Unterstützung in VS2010 vergleiche war ich in VB deutlich schneller.

HiQ-Software hat gesagt…

Natürlich muss ich in C# den Event Handler nicht als Lambda schreiben, sondern als anonyme Methode. Dann muss ich aber die volle Signatur angeben, die den Code um einiges länger macht.

Der Punkt ist, dass ich in C# eben NICHT die Signatur angeben muss. Die Frage ist doch warum muss ich das in VB machen? Warum gibt es in VB keine Typherleitung für solche Zwecke.

Sicherlich ist die Kürze des Codes kein Qualitätsmerkmal. Worauf ich aber in letzter Zeit vermehrt wert lege ist, dass der Code so wenig "Rauschen" wie möglich hat.

Und da ist nicht C# oder VB vorne sonder F#!

Ramirez hat gesagt…

Vielleicht stehe ich gerade auf dem Schlauch, aber ich verstehe Deine Antwort nicht:

C#
... (s,e) => ...

VB
... Sub(s,e) ...

wo bitte muss man in VB die volle Signatur angeben? Dank relaxed Delegates könnte man das s,e sogar weglassen, aber in dem Beispiel wurde auf e zurückgegriffen.

Wie geschrieben hat mir VS2010 in VB hierfür automatisch IntelliSense für e angeboten, während in C# e ein Paramter war, wo ich selber wissen musste, dass es eine Property Result gibt.

Zu F# kann ich nix sagen, fehlt mir bisher die Zeit das mal anzugucken.

HiQ-Software hat gesagt…

Da habe ich wohl zu früh meinem Ärger Luft gemacht!

Natürlich gibt es in VB10 relaxed Delegates. Demnach gibt es keinen Unterschied zum C# Code!