Kapitel 1 Einleitung
1.1 Wozu eine weitere Sprache?
 
Sie fragen sich bestimmt auch, »Warum noch
eine Sprache? Warum nicht weiterhin C++ nutzen?« (oder
VB oder Java oder welche Sprache auch immer Sie bevorzugen). Zumindest
werden Sie sich das gefragt haben, bevor Sie das Buch kauften.
Programmiersprachen können auf gewisse Weise
mit Elektrowerkzeugen verglichen werden. Jedes Werkzeug ist für
einen bestimmten Zweck besonders geeignet. Ich könnte
beispielsweise ein Brett mit Hilfe einer Fräse kürzen, es
wäre jedoch sehr viel einfacher, eine Säge zu benutzen. Genauso
könnte ich mit Hilfe einer Programmiersprache wie LISP ein Computerspiel
mit aufwendiger Grafikanimation schreiben, mit C++ wäre es aber
wahrscheinlich einfacher.
C# (ausgesprochen »C sharp«) ist die systemeigene
Sprache für die .NET Common Language Runtime. C# wurde entworfen,
um sich nahtlos in die .NET-Laufzeitumgebung einzufügen. Sie können
(und sollten dies gelegentlich auch) Code entweder in Visual C++
oder Visual Basic schreiben, in den meisten Fällen ist C#
jedoch geeigneter. Da die Common Language Runtime einen Kernpunkt für viele Funktionen von C#
darstellt, wird diese Laufzeitumgebung in Kapitel 2, Die .NET-Laufzeitumgebung,
näher vorgestellt – vor allem diejenigen Elemente, die für
die Sprache C# von besonderer Bedeutung sind.
1.2 Die Entwicklungsziele bei C#
 
Die erste Veröffentlichung von C++ sorgte für
einige Aufregung. Hier wurde eine Programmiersprache zum Erstellen objektorientierter
Software angeboten, bei der C-Programmierer ihr bereits vorhandenes
Wissen und ihre Software weiter nutzen und ausbauen konnten. C++ ist
nicht so objektorientiert wie beispielsweise Eiffel, stellte aber dennoch
genügend objektorientierte Funktionen bereit, um große Vorteile
zu bieten.
Mit C# verhält es sich ähnlich. In Kombination
mit der .NET Common Language Runtime kann diese Sprache für die Entwicklung komponentenorientierter
Software eingesetzt werden, ohne dass die Programmierer ihr Potenzial
im Hinblick auf C-, C++- oder COM-Code ungenutzt lassen müssen.
C# wurde für die Entwicklung robuster, langlebiger
Komponenten konzipiert, mit denen Situationen des wirklichen Lebens
bewältigt werden können.
1.2.1 Komponentensoftware
 
Die .NET Common Language Runtime ist eine komponentenbasierte
Umgebung, daher ist es wohl keine Überraschung, dass C# die Komponentenerstellung
vereinfacht. Es ist eine Programmiersprache, die sich auf Komponenten
konzentriert, d. h., alle Objekte werden als Komponenten geschrieben,
und die Komponenten bilden den Mittelpunkt aller Geschehnisse.
Die komponentenbezogenen Konzepte, beispielsweise
Eigenschaften, Methoden und Ereignisse, stellen die Kernelemente der
Sprache und der zugrunde liegenden Laufzeitumgebung dar. Deklarative
Informationen (die Attribute) können auf Komponenten angewendet
werden, um anderen Bestandteilen des Systems Entwurfszeit- und Laufzeitinformationen
zu einer Komponente zu liefern. Die Dokumentation kann innerhalb der
Komponente geschrieben und in XML exportiert werden.
C#-Objekte erfordern weder Header- oder IDL-Dateien noch Typbibliotheken. Die in C# erstellten Komponenten
sind vollständig selbstbeschreibend und können ohne Registrierung
eingesetzt werden.
C# wird bei der Komponentenerstellung von der .NET-Laufzeitumgebung und dem .NET-Framework unterstützt, die zusammen
ein einheitliches Typensystem bereitstellen, bei dem jedes Element als
Objekt behandelt werden kann, ohne dass – wie bei rein objektorientierten
Systemen wie z. B. Smalltalk – Leistungseinbußen hingenommen
werden müssen.
1.2.2 Robuste und langlebige Software
 
In der komponentenbasierten Welt ist die Entwicklung
von robuster und langlebiger Software ein sehr wichtiger Aspekt. Webserver
können monatelang ohne einen außerplanmäßigen Neustart
ausgeführt werden, und jeder weiß, dass nicht geplante Neustarts
nichts Wünschenswertes sind.
Mit der Speicherbereinigung wird dem Programmierer die Last der Speicherverwaltung
abgenommen1 . Dem Problem der Versionssteuerung für Komponenten wird durch
die Definition einer entsprechenden Semantik und die Möglichkeit
zur Trennung von Schnittstelle und Implementierung begegnet. Numerische
Operationen können auf einen möglichen Überlauf geprüft
werden und Arrays unterstützen die Bereichsprüfung.
C# bietet eine einfache, sichere und intuitive Umgebung. Die Fehlerbehandlung wird hierbei ebenfalls berücksichtigt:
Eine Ausnahmebehandlung ist in der gesamten Umgebung verfügbar.
Die Sprache ist typensicher und bietet dem Programmierer Schutz vor
nicht initialisierten Variablen, unsicheren Typumwandlungen und weiteren
häufig auftretenden Programmierfehlern.
1.2.3 Software für das wirkliche Leben
 
Softwareentwicklung ist keine einfache Sache. Die
Software kann in den seltensten Fällen von Grund auf neu entwickelt
werden. Worauf es ankommt, sind eine annehmbare Leistung, die Integration
mit vorhandenem Code sowie ein gutes Kosten-Nutzen-Verhältnis.
Eine gut entworfene Umgebung nützt nichts, wenn sie im wirklichen
Leben nicht standhalten kann.
C# weist die Vorteile einer eleganten und einheitlichen
Umgebung auf und bietet dennoch Zugriff auf weniger »anständige«
Funktionen (beispielsweise Zeiger), wenn diese benötigt werden.
Mit C# gehen die Investitionen in vorhandenen Code
nicht einfach verloren. Vorhandene COM-Objekte können wie .NET-Objekte eingesetzt werden2 . Mit der .NET Common Language Runtime erscheinen dem vorhandenen
COM-basierten Code die Objekte in der Laufzeitumgebung wie COM-Objekte.
Systemeigener C-Code in DLL-Dateien kann über den C#-Code aufgerufen
werden3 .
C# bietet Lowlevelzugriff, falls erforderlich. Kleine schlanke Objekte können
einem Stack zugewiesen werden und dennoch Bestandteil der einheitlichen
Umgebung sein. Lowlevelzugriff wird über den so genannten unsafe-Modus
gewährt, bei dem der Einsatz von Zeigern möglich ist, wenn
die Leistung eine besonders große Rolle spielt oder Zeiger für
vorhandene DLLs benötigt werden.
C# baut auf C++ auf, daher wird sich jeder C++-Programmierer schnell in dieser Sprache wohl fühlen. C#
ist schnell erlernbar und führt zu höherer Produktivität
ohne Leistungseinbußen.
Darüber hinaus setzt C# auf die Stärken
der .NET Common Language Runtime, die umfangreiche Bibliotheksunterstützung
für allgemeine Programmieraufgaben und anwendungsspezifische Aufgaben
bietet. Die .NET-Laufzeitumgebung, die Frameworks und die verschiedenen Programmiersprachen
werden in der Visual Studio-Umgebung zu einem Universalpaket für den .NET-Programmierer
zusammengefasst.
1
Die Speicherverwaltung von C++ ist nicht wirklich
schwierig, in Bezug auf die Komponenten kann es jedoch einige knifflige
Situationen geben. Das Hauptproblem bei der Speicherverwaltung liegt
darin, dass Zeit und Mühe investiert werden müssen. Mit der
Speicherbereinigung ist es nicht länger erforderlich, Zeit auf
die Codierung und Prüfung zu verwenden, um Speicherlecks zu vermeiden.
Auf diese Weise kann sich der Programmierer auf die Programmlogik konzentrieren.
2
Normalerweise. In einigen Fällen ist dies in
der Praxis etwas schwieriger umzusetzen.
3
Visual C++ wurde mit so genannten »verwalteten
Erweiterungen« ausgestattet, die das Erstellen von .NET-Komponenten
ermöglichen. Weitere Informationen zu diesen Erweiterungen finden
Sie in der Microsoft-Website.
|