zurück zum Artikel

C# oder Visual Basic? Die richtige Programmiersprache für .NET-Entwickler

Dr. Holger Schwichtenberg, Alexander Neumann

C# oder Visual Basic ist immer noch eine Frage, die viele Projektteams bewegt hat. Immer scheint C# zu gewinnen, dabei ist Visual Basic gar nicht schlechter, sondern nur mit dem schlechten Ruf aus der Vergangenheit belastet.

Wie die Überschrift des Artikels zum Ausdruck bringt, handelt es sich fast schon um einen Glaubenskrieg in der .NET-Entwicklergemeinde um die Wahl der "richtigen" Programmiersprache. C# oder Visual Basic heißt die Frage, die schon viele Projektteams bewegt hat. Immer häufiger scheint C# zu gewinnen, dabei ist Visual Basic gar nicht weniger leistungsfähig, sondern nur mit dem schlechten Ruf aus der Vergangenheit belastet.

Mehr Infos

10 wichtige Fragen zu .NET

In dieser zehnteiligen Serie liefert .NET-Experte Holger Schwichtenberg Antworten auf die am häufigsten gestellten Fragen, die .NET-Entwickler beschäftigen.

  1. Reicht .NET 2.0, oder muss man .NET 3.5 einsetzen? [1]
  2. C# oder Visual Basic? Die richtige Programmiersprache für .NET-Entwickler

Während die Programmiersprache Java in den 1990er-Jahren mit dem Leitsatz "Eine Sprache für alle Plattformen" angetreten ist, zielte Microsoft zunächst mehr auf "Eine Plattform für alle Sprachen" ab. Von Anfang an stand die Integration zahlreicher Programmiersprachen im .NET-Mittelpunkt. Inzwischen weichen die gegensätzlichen Positionen von Java und .NET auf: Es gibt .NET-Laufzeitumgebungen für andere Plattformen, und es gibt Compiler für andere Programmiersprachen, die auch Java-Bytecode erzeugen können.

Insgesamt existieren mittlerweile über 50 Programmiersprachen für .NET. Darunter sind nicht nur objektorientierte Sprachen wie C#, Java, C++, Visual Basic (VB) und Delphi, sondern auch funktionale wie SML (Standard ML), Caml und Haskell sowie "alte Tanten" wie Fortran und Cobol vertreten. Es gibt sowohl kommerzielle als auch kostenlose Implementierungen. Eine ständig aktualisierte Liste der .NET-Programmiersprachen findet man unter dotnetframework.de [2].

Wirklich bedeutend sind nur C# [3] und Visual Basic (.NET) [4]. Mit deutlichem Abstand folgt C++/CLI [5], die C++-Variante für .NET, die vor allem für die Migration von C++-Code nach .NET und die Integration bestehenden C++-Codes in .NET-Projekte wichtig ist. F# [6], Microsofts neue Mehrparadigmen-Sprache, die sich vor allem durch funktionale Konstrukte von C# abhebt, könnte an Bedeutung gewinnen, da Microsoft sie ab Visual Studio 2010 mit der Entwicklungsumgebung ausliefert.

Visual Basic hat eine lange Tradition in der Windows-Entwicklerwelt. Die Sprache galt in den Versionen 1.0 bis 6.0 als einfach und sehr produktiv, war aber gleichzeitig als unsauber und unstrukturiert verpönt (gerade bei Entwicklern, die mit C++, Delphi oder Java gearbeitet haben). Visual Basic 6.0 war allenfalls eine objektbasierte Sprache. Es fehlten insbesondere Konstrukte zur Implementierungsvererbung.

Mit dem Wechsel von Visual Basic 6.0 zur Version 7.0 hatte Microsoft jedoch einen radikalen Wandel vollzogen. Die neue Version wurde eine echte objektorientierte Sprache mit Vererbung, fast ebenso mächtig wie das gleichzeitig neu entwickelte C#. Bis zur aktuellen 9.0-Release gab es weitere Angleichungen, zum Beispiel Operatorüberladung. Eine Aussage von COM- und .NET-Guru Don Box [7] über VB 7.0, die bereits aus dem Jahr 2001 stammt, sei an dieser Stelle zitiert: "Visual Basic .NET bedeutet, dass man sich nicht länger schämen muss, ein VB-Entwickler zu sein!" Microsoft hat bei VB.NET ganz bewusst auf die Kompatibilität mit der VB-6.0-Vorgängerversion verzichtet und nahm aus zwei Gründen Inkompatibilität hin:

  1. Man bereinigte alle Funktionen aus VB 6.0, die signifikante Verwirrung bei den Entwicklern stifteten.
  2. Man änderte oder entfernte alle Features aus VB 6.0, die nicht kompatibel mit dem .NET Framework waren.

Etwas konfus war die Namensgebung. Aus Visual Basic 6.0 wurde Visual Basic .NET 7.0. Jedoch verzichtet Microsoft seit Version 8.0 in .NET 2.0 wieder auf den Zusatz .NET, sodass die Versionen seitdem Visual Basic 8.0 (alias Visual Basic 2005) und Visual Basic 9.0 (alias Visual Basic 2008) heißen. Die offizielle Begründung war, dass es nun hinlänglich bekannt sei, dass die neuen Versionen auf .NET basieren. Zu vermuten ist jedoch, dass dies eher passiert ist, um den Widerstand einiger Entwickler zu brechen, die nicht von Visual Basic 6.0 auf .NET umsteigen wollten. Befürchten kann man nur, dass – nachdem Microsoft eine Zeit lang die Buchstaben .NET auf alles geklebt hat, egal ob .NET drin war oder nicht – nun das Ruder in das andere unvernünftige Extrem umschlägt.

Seit dem Wegfall von ".NET" im Namen ist es nicht leicht, in der Schriftsprache zwischen dem "alten" Visual Basic (Versionen 1.0 bis 6.0) und dem neuen (Versionen ab 7.0) zu unterscheiden. Es bietet sich an, vom "klassischen Visual Basic" oder "COM-basierten Visual Basic" im Kontrast zum ".NET-basierten Visual Basic" zu sprechen. Als Alternative ginge auch "Visual Basic (.NET)".

C# ist eine Programmiersprache, die Microsoft neu für das .NET Framework entwickelt hat. Das "#" könnte man in ein vierfaches Pluszeichen aufspalten (also C++++). Vor allem C++ und Java haben C# konzeptionell beeinflusst; es lassen sich aber auch Parallelen zu Visual Basic und Delphi finden.

C# ist das Ergebnis eines Projekts, das Microsoft startete, nachdem Sun Microsoft Ende der 1990er-Jahre die Weiterentwicklung von J++, einer Microsoft-eigenen Anpassung des von Sun entwickelten Javas, verboten hatte. "Vater" von C# ist Anders Hejlsberg [8], der zuvor Entwickler von Turbo Pascal und Borlands Delphi war. Inzwischen ist C# bei der ECMA (ECMA Standard 334, Arbeitsgruppe TC39/TG2) und bei der ISO (ISO/IEC 23270) standardisiert.

Hinsichtlich der Versionsnummern von C# herrscht etwas Verwirrung. Es gibt einerseits eine offizielle Zählung mit Versionsnummer (parallel zum .NET Framework), andererseits mit Jahreszahlen (parallel zu Visual Studio). Intern verwenden die Entwickler eine dritte Zählung für den Compiler. Die erste Version von C# im Rahmen des .NET Framework 1.0 trug intern die 7.0. Zu .NET 1.1 gab es dann C# 7.1, im .NET Framework 2.0 und 3.0 meldet sich der C#-Compiler mit Version 8.0. Das .NET Framework 3.5 enthält den Compiler in der Version 9.0. Offiziell zählt Microsoft dennoch die Versionsnummern von C# analog zu denen des Frameworks – ausgenommen im .NET Framework 3.5. Darin ist C# 3.0 (alias C# 2008) enthalten.

bild1.jpg

Tabelle 1: C# hat drei unterschiedliche Versionsnummern

Tabelle 2 [9] zeigt die wichtigsten Unterschiede zwischen den beiden Sprachen. Visual-Basic-Code ist tendenziell etwas länger als C#-Code, denn Blöcke lassen sich nicht mit geschweiften Klammern, sondern mit Wörtern (zum Beispiel "Class... End Class, For....Next") bilden. Viele Wörter sind in Visual Basic sprechender: "MustInherit" statt "abstract", "NotInheritable" statt "sealed", "Overridable" statt "virtual".

Die Objektorientierung (OO) ist in beiden Sprachen gleich ausgeprägt. In Visual Basic könnte man den OO-Stil aber durch die exzessive Verwendung des Schlüsselwortes "Module" an vielen Orten umgehen. In C# gibt es das gleiche Konstrukt, es heißt dort "static class". Da man zusätzlich in C# vor jedes Klassenmitglied "static" schreiben muss, ist die Hemmschwelle etwas höher als in Visual Basic.

Bei der Typisierung läuft der Visual Basic Compiler von Hause aus in einem weniger strengen Modus. Die beiden folgenden Zuweisungen akzeptiert der Compiler, zur Laufzeit steht das Programm aber in der zweiten Zeile mit einer "InvalidCastException".

  Dim s As String = 5
Dim i As Int16 = "5s"
bild1.jpg

Aktivieren der strengeren Typprüfung im Visual Basic Compiler (Abb. 1)

Das vermeidet man einfach, indem man den Visual-Basic-Compiler in den strengeren Modus schaltet (Option Strict) (siehe Abb. 1). In C# gibt es nur diesen strengen Modus.

C# steht in der Tradition von C++ beziehungsweise Java und unterscheidet daher – anders als Visual Basic – zwischen Groß- und Kleinschreibung. Da es gemäß Common Language Specification (CLS [10]) sowieso keine Schnittstellen geben darf, die zwischen zwei Bezeichnernamen nur durch Groß- und Kleinschreibung zu unterscheiden sind, ist die Groß- und Kleinschreibung in C# kein funktionaler Vorteil, sondern nur eine Frage des Geschmacks.

Der in Visual Studio mitgelieferte Editor für Visual Basic war immer etwas besser als der für C#. Beispielsweise fügt der Visual-Basic-Editor automatisch das Blockende in den Code ein, während man bei C# explizit eine schließende Klammer eingeben muss (dafür braucht man Zusatzwerkzeuge wie Resharper [11]).

Bei der Geschwindigkeit gibt es keine Unterschiede: Beide Sprache erzeugen die Microsoft Intermediate Language [12] (alias Common Intermediate Language [13]), die der Just-In-Time-Compiler ausführt. Kleine Unterschiede gibt es in dem erzeugten Zwischencode, die aber zu vernachlässigen sind.

Ein funktionaler Unterschied liegt in der Unterstützung für Zeigerarithmetik im Stil von C++ vor, die es in C# gibt, nicht aber in Visual Basic. Die Tatsache, dass der Entwickler vor jedem Zeigerarithmetikeinsatz das Schlüsselwort "unsafe [14]" verwenden und zudem den Compiler in einen "unsafe"-Modus schalten muss, sagt alles über die Bedeutung dieser Funktion aus.

Der Rest der Unterschiede sind rein syntaktische Zuckerstückchen [15], das heißt vereinfachte Ausdrucksformen für Funktionen, die auch anders zu erreichen sind.

Ein Beispiel, bei dem Visual Basic klar gewinnt, ist das späte Binden. In C# braucht man hier Reflection (Abb. 2 und 3).

bild2.jpg

Spätes Binden in Visual Basic 2008 (Abb. 2)
bild3.jpg

Spätes Binden in C# 2008 (Abb. 3)

Hingegen kann man in C# im Moment Properties [16] viel prägnanter deklarieren als in Visual Basic, wobei man auf eine explizite Vergabe von Namen für die privaten Mitglieder verzichtet (Abbildung 4 und 5). Beide Unterschiede verschwinden übrigens in der nächsten Version.

bild5.jpg

Eine Klasse mit vier Properties in Visual Basic 2008 (Abb. 4)
bild6.jpg

In C# 2008 kann man das wesentlich kürzer schreiben (Abb. 5).

Einen klaren Vorteil, den Visual Basic in .NET 4.0 behält, sind die XML-Literale (Abb. 6). Man kann XML-Tags direkt in die Sprache einbetten. In C# müsste man viel umständlicher immer wieder Bezug nehmen auf die Klasse "Xelement".

bild4.jpg

XML-Literale in Visual Basic 2008 (Abb. 6)

Die nächsten Versionen der beiden .NET-Hauptsprachen erscheinen zusammen mit .NET 4.0 [17] und Visual Studio 2010 [18] Anfang des nächsten Jahres. Hauptneuerung in C# 4.0 ist das dynamische Programmieren. Eine mit dem Schlüsselwort "dynamic" deklarierte Variable löst nicht mehr der Compiler, sondern die CLR zur Laufzeit auf. In Visual Basic gab es dieses späte Binden schon zu Zeiten des klassischen Visual Basic durch den Typ "Object"; in C# ging das bisher nur umständlich über die Reflection-Bibliothek. Die dynamische Programmierung bietet Vorteile beim Umgang mit COM-Objekten und im Zusammenspiel mit dynamischen Programmiersprachen wie Python und Ruby. Auch mit optionalen und benannten Parametern zieht C# endlich gleich mit Visual Basic. Neu sind hingegen Co- und Contravarianz für Typparameter, die Zuweisungen zwischen Objektmengen mit verwandten Typen ermöglicht.

Visual Basic 10.0 bietet etwas mehr neue Funktionen, insbesondere durch das Nachholen von Features, die C# bereits in Version 3.0 erhielt. In diese Kategorie gehören automatische Properties (ohne expliziten Getter und Setter) und Mengeninitialisierungen. Aus C# 4.0 ist die Co- und Contravarianz enthalten. Außerdem kann der Entwickler nun mit Visual Basic in einigen Fällen Zeilenumbrüche in seinen Code einbauen, ohne die Zeilen mit einem Unterstrich zu verbinden.

Mehr Infos

Marktindikatoren

Zuverlässige Daten darüber, ob mehr C# oder Visual Basic (.NET) eingesetzt wird, gibt es nicht. Gewisse Indikatoren sprechen für C#. Im Gulpometer [19] liegt C# vor Basic und das, obwohl "Basic" hier die .NET-Varianten umfasst. Auf der Fachkonferenz BASTA in diesem Frühjahr hat der Autor des Artikels bei der Keynote gefragt, wer womit programmiert. Von rund 600 Leuten meldeten sich nur etwa 30 bei Visual Basic. Dabei steht "BASTA" für "Basic-Tage". Gut möglich, dass sich viele VB-Entwickler nicht getraut haben, angesichts der zu erwartenden Übermacht von C#.

Die neuen Sprachfunktionen halten sich demnach in Grenzen (verglichen mit den großen Wellen, die es in .NET 2.0 und .NET 3.5 gab). Interessant ist die Aussage von Mads Torgersen, Produktmanager für C#, im Dokument "New features in C# 4.0 [20]", dass C# und Visual Basic in Zukunft hinsichtlich ihrer Funktionen noch mehr im Gleichschritt gehen sollen als bisher. "Die Sprachen sollen sich in Stil und Gefühl unterscheiden, nicht in ihrem Funktionsumfang".

C# oder Visual Basic? Der Glaubenskrieg ist überflüssig, denn es gibt nur eine Antwort: Es ist egal. In der Vergangenheit gab es ein paar Statistiken, die besagten, dass ein C#-Entwickler deutlich mehr bekommt (nicht: verdient) als ein Visual-Basic-Entwickler, weil Ersterer oft vorher aus dem Umfeld von C++ oder Java kommt und dort anspruchsvollere Anwendungen entwickelt hat als die Kollegen, die vorher Visual Basic 5.0 oder 6.0 programmiert haben. Das aktuelle Gulpometer besagt, dass C# mit 64 Euro Stundenlohn für einen Freiberufler nur noch einen Vorteil von einem Euro gegenüber Visual Basic hat.

Wenn man nach Entwicklern sucht, ist es nicht wichtig, ob sie C# oder Visual Basic (.NET) können. Nur sollte man niemals jemanden einstellen, der darauf beharrt, nur eine der beiden Sprachen programmieren zu können oder zu wollen. Diese Form der "Beharrlichkeit" ist nämlich ein Zeichen von Inkompetenz.

Dr. Holger Schwichtenberg
bietet mit seinem Unternehmen IT-Visions.de [21] Beratung und Schulungen im .NET-Umfeld. Er hält Vorträge auf Fachkonferenzen und ist Autor zahlreicher Fachbücher.

tabelle2.jpg

Tabelle 2: Visual Basic .NET versus C#. (Mit einem Stern markierte Unterschiede verschwinden ab .NET 4.0)

(ane [23])


URL dieses Artikels:
https://www.heise.de/-227234

Links in diesem Artikel:
[1] https://www.heise.de/hintergrund/Reicht-NET-2-0-oder-muss-man-NET-3-5-einsetzen-227230.html
[2] http://www.dotnetframework.de/dotnet/produkte/sprachen.aspx
[3] http://www.it-visions.de/l294.aspx
[4] http://www.it-visions.de/l223.aspx
[5] http://www.it-visions.de/l3027.aspx
[6] http://msdn.microsoft.com/de-de/magazine/cc164244.aspx
[7] http://en.wikipedia.org/wiki/Don_Box
[8] http://de.wikipedia.org/wiki/Anders_Hejlsberg
[9] #l1-u2
[10] http://de.wikipedia.org/wiki/Common_Language_Specification
[11] http://www.jetbrains.com/resharper/features/coding_assistance.html
[12] http://www.it-visions.de/l138.aspx
[13] http://www.it-visions.de/l449.aspx
[14] http://msdn.microsoft.com/de-de/library/chfa2zb8(VS.80).aspx
[15] http://en.wikipedia.org/wiki/Syntactic_sugar
[16] http://www.it-visions.de/l424.aspx
[17] http://www.it-visions.de/l4317.aspx
[18] http://www.it-visions.de/l4280.aspx
[19] http://www.gulp.de/kb/tools/gulpometer.html
[20] http://code.msdn.microsoft.com/csharpfuture
[21] http://www.IT-Visions.de
[22] 
[23] mailto:ane@heise.de