Site logo
Site logo
Programmieren aus Leidenschaft
Programmieren aus Leidenschaft

C# - Eine Übersicht


Die Programmiersprache C# (gesprochen c-sharp, oder auch see-sharp) ist eine objektorientierte Programmiersprache (OOP) und als Weiterentwicklung von C++ zu sehen, obwohl C# auch eindeutige Parallelen zur Sprache Java aufweist. C# wurde bei Microsoft unter der Leitung von Anders Hejlsberg entwickelt. Der Däne Hejlsberg ist kein umbeschriebenes Blatt, wenn es um die Entwicklung von Programmiersprachen geht. Vor seiner Anstellung bei Microsoft war Hejlsberg mehrere Jahre lang bei Borland bei den Projekten Turbo Pascal und Borland Delphi federführend. Die Sprache C# wurde direkt für das .NET Framework entwickelt, was einfach ausgedrückt, eine Klassenbibliothek für Microsoft Windows darstellt.

Ähnlich wie Java wird auch C# Code bei der Kompilierung nicht in Maschinencode, sondern in einen Zwischencode übersetzt. Dieser, auch Intermediate Language (IL) genannte Code, wird erst zur Laufzeit von einem Just-In-Time Compiler in echten Maschinencode umgesetzt und ausgeführt. Durch Verwendung der IL ergibt sich wie bei Java eine Plattformunabhängigkeit, die aber bei C# nur in der Theorie besteht. Zwar gibt es C# Umgebungen auch für Linux und Mac OS X Systeme, aber keines diese Projekte ermöglicht zur Zeit vollständige Kompatibilität und keines wird von Microsoft gefördert. Es ist fraglich, ob eine vollständige Kompatibilität nicht sogar generell unmöglich ist, da mit C# auch Windows spezifische Vorgänge, wie das Benutzen der Registry, möglich sind. Auch ist die Entwicklung von .NET und C# keineswegs abgeschlossen, so dass Implementierungen auf anderen System immer etwas hinterher hinken werden.

C# ist eine streng typitisierte Sprache. Datentypen wie "Variante", die es zum Beispiel in klassischen Visual Basic gibt und die viele verschiedene Arten von Daten aufnehmen können, sucht man in C# vergebens. Auch lässt sich eine Variable nicht immer ohne weiteres in einen anderen Datentyp umwandeln. In der Regel gibt es hier für zahlreiche Konvertrierungsmethoden wie int.parse oder ToString. Dadurch wird sichergestellt, dass man genau diese Konvertierung machen möchte und nicht versehentlich eine Zahl in einen Text konvertiert.

Sowohl Werte- (int,char ...) als auch Referenztypen (string, class...) sind in C# von Object abgeleitet. Object ist also die Basisklasse aller C# Datentypen und ist unter anderem dafür zuständig, dass Speicherplatz reserviert wird. Eine Eigenschaft, die an alle anderen Datentypen vererbt wird. Ausserdem erben alle Datentypen die ToString-Methode von Object. Ein weiterer Vorteil einer gemeinsamen Basisklasse ist ein als Boxing/Unboxing bekanntes Verfahren, mit dem auch ein Wertetyp in einen Referenztyp, nämlich Object, und wieder zurück konvertiert werden kann.

Scheinbar unendlich scheinen auch die Datentypen die Windows Steuerelemente repräsentieren. Konnte man in C++ einem Listcontrol noch einen Text hinzufügen, so ist dies in C# nicht mehr möglich. Ein ListView kann nur noch ListViewItems aufnehmen, diese können wiederum Texte und Symbole beinhalten. Diese strenge Regelung bringt auf den ersten Blick sehr viel mehr Programmierarbeit, ist aber eine Arbeit, die sich lohnt, da Fehler schon im Vorfeld verhindert werden können.

Eine der weniger bekannten Eigenschaften von C#, oder sogar allen Sprachen auf .NET Basis, ist die relativ einfache Disassemblierung des Codes. Durch Verwendung der IL und dem Fehlen des echten Maschinencodes kann ein Programm mit geringem Aufwand wieder in Quellcode umgewandelt werden. Sehr eindrucksvoll kann man dies mit dem kostenlosen Tool "Reflector for .NET" von Lutz Roeder demonstrieren. http://www.aisto.com/roeder/dotnet/

Erwähnenswert ist hierbei auch Reflection als Eigenschaft von C#. Dieses "sich selbst betrachen" ermöglicht es einem Programm Informationen über sich selbst zu geben, also Methoden- und Variablennamen auszugeben oder den Datentyp einer Variablen zu erkennen. Ermöglicht wird Reflection durch Metadaten, die automatisch im erstellten Programm eingebettet werden.

Auch die in C++ benötigten Headerdatein gibt es in C# nicht mehr. Klassen, sofern sie im gleichen Namespace liegen, können ohne weiteres in allen Programmteilen benutzt werden. Aber mit Version 2.0 von C# ist es sogar möglich, eine Klasse auf mehrere Quellcodedateien zu verteilen, um so den Code noch besser zu organisieren.

Eine weitere Parallele zu Java besteht darin, dass C# Anwendungen in einem abgeschotteten Speicherbereich laufen, und auf Speicherbereiche anderer Anwendungen keinen Zugriff haben. Sowohl in Java als auch in C# kennt man solche Umgebungen als„Virtual Machine“ und die Laufzeitumgebung für C# im speziellen als „.NET Framework Common Language Runtime“, oftmals CLR abgekürzt. C# Code, der in dieser CLR ausgeführt wird als „managed Code“ bezeichnet, wohingegen reiner Maschinencode als „unmanaged Code“ bezeichnet wird. Sollte es nötig sein, ist es sogar möglich auch unmanaged Code in einem C# Programm zu verwenden.

Oftmals wir behauptet, dass C# ohne Zeiger auskommt. Dass ist insofern richtig, wenn man darunter die aus C++ bekannten Zeiger auf Speicherbereiche versteht. Natürlich können auch in C# weiterhin mehrere Variablen auf den selben Speicherbereich zeigen, aber es ist weitaus unkomplizierte als in C++. In der Regel verwendet man in C# Referenzen anstelle von Zeigern.

Im Gegensatz zu ihrem Vorfahren C++ verfügen C# und auch Java über einen Garbage Collector. Diese Form der Speicherverwaltung erkennt automatisch nicht mehr benutzte Objekte eines Programms und gibt deren Speicherbereiche wieder frei. In der Regel braucht sich der Entwickler nicht um den Garbage Collector kümmern, da er automatisch ausgeführt wird. Allerdings ist es durchaus möglich, die Ausführung des Garbage Collectors manuell zu starten. Trotzdem hat man wenig Einfluss darauf, wann und welche Objekte freigegeben werden.

Als de facto Standart für die Erstellung von C# Anwendungen hat sich Microsoft Visual Studio durchgesetzt, wobei die Visual C# Express Edition sogar kostenlos erhältlich ist. Ein weiteres Entwicklerwerkzeug ist SharpDevelop (#develop).
Für Programmierer, die sich für C# Entwicklung jenseits von Windows interessieren ist die Mono Projekt Webseite die erste Anlaufstelle obwohl man nicht verschweigen sollte, das mache Werkzeuge noch in einem sehr frühen Beta-Stadium befinden.
http://www.mono-project.com