Programmieren in C#: Einführung


Kapitel 1: Einführung


Inhaltsverzeichnis

Dieses Buch ist unter einer Creative Commons-Lizenz lizensiert.


1.1 C# und die Microsoft .NET-Plattform

Komponentenorientierte Softwareentwicklung für das 21. Jahrhundert

Wer sich mit C# befasst, muss sich mit der Microsoft .NET-Plattform beschäftigen. Denn mit C# entwickelte Programme laufen auf der Microsoft .NET-Plattform. Was aber ist die .NET-Plattform?

Bei der .NET-Plattform handelt es sich um eine virtuelle Maschine, die Programmen, die für diese Plattform entwickelt wurden, einen Prozessor vorgaukelt, der so in Form eines echten Computerchips gar nicht existiert. .NET-Programme glauben demnach, sie laufen auf einem ganz bestimmten Prozessor, auch wenn in Ihrem Computer ein ganz anderer Computerchip von Intel oder AMD drinnensteckt. Der Vorteil dieser virtuellen Maschine ist, dass die Laufzeitumgebung von .NET-Programmen vollständig definiert ist und nicht vom im Computer verwendeten Computerchip abhängt. Für ein .NET-Programm sieht demnach die Welt ganz einfach aus: Es scheint nur einen einzigen Prozessor zu geben - nämlich den, den Microsoft in der Spezifikation der .NET-Plattform definiert hat.

Modell zur Erklärung der .NET-Plattform

Die Definition einer virtuellen Maschine koppelt Programme von der Hardware und vom Betriebssystem ab. So kann ein für die .NET-Plattform entwickeltes Programm auf jedem Computer ausgeführt werden, auf dem die .NET-Plattform verfügbar ist - völlig egal, welcher Computerchip verwendet wird. Wenn die .NET-Plattform auf einem entsprechenden System verfügbar ist, gaukelt sie eben auf diesem System .NET-Programmen den notwendigen Prozessor vor.

Auch wenn die .NET-Plattform von Microsoft für Windows entwickelt wurde, ist es möglich, sie auf andere Betriebssysteme zu portieren. So existiert ein Projekt namens Mono, dessen Ziel es ist, .NET-Programme unter Linux zum Laufen zu bringen. Das ist möglich, weil .NET-Programme auf einer virtuellen Maschine laufen, ohne Zugriff auf das Betriebssystem zu nehmen. Ein .NET-Programm sieht nur die .NET-Plattform und nicht das Betriebssystem, auf dem die .NET-Plattform läuft.

So schön die Vorteile der virtuellen Maschine sind, stellt sich dennoch die Frage, warum Microsoft sich entschloß, die .NET-Plattform zu entwickeln. Schließlich laufen Windows-Anwendungen seit Jahrzenten vorwiegend auf Intel-Chips vom Typ x86 oder auf zu dieser Chip-Familie kompatiblen Prozessoren anderer Hersteller. Auch die Möglichkeit, .NET-Programme auf anderen Betriebssystemen wie eben Linux ausführen zu können, wird für Microsoft kaum ein wichtiges Ziel gewesen sein.

  • Die Entwicklung der .NET-Plattform ermöglichte Microsoft einen kompletten Neuanfang mit einer vollständigen Kontrolle über die Ausführungsumgebung. Während die Entwicklung auf der Hardwareseite durch die Hersteller von Prozessoren und anderen Geräten bestimmt wird, muss Microsoft als Betriebssystemhersteller auf der Softwareseite eine Abwärtskompatibilität sicherstellen. Da Anwender typischerweise Programme bei einem Upgrade von einer älteren auf eine neue Windows-Version mitnehmen möchten, muss Microsoft über Jahre hinaus alte Betriebssystemschnittstellen unterstützen. Auch wenn Microsoft selbst diese alten Schnittstellen nicht mehr verwendet, muss aufgrund der Abwärtskompatibilität Rücksicht genommen werden auf Anwender, die alte Programme weiterverwenden möchten. Die Abhängigkeit von Hardwareherstellern und neuen Hardwareentwicklungen als auch Probleme verursacht durch die Notwendigkeit der Abwärtskompatibilität verschwinden durch die Entwicklung einer neuen, eigenen Plattform.

  • Eine virtuelle Maschine kann so konstruiert werden, dass die Entwicklung von Software für die virtuelle Maschine einfacher wird als die Entwicklung sogenannter nativer Programme, die auf einem echten Prozessor laufen. So existiert auf der .NET-Plattform ein sogenannter Garbage Collector. Dieser Garbage Collector nimmt .NET-Programmen die Verwaltung von Speicher ab, was in nativen Programmen oft eine schwierige Angelegenheit ist, die im Fehlerfall sogar zum Absturz eines Programms führen kann. Indem die .NET-Plattform die Speicherverwaltung automatisiert, können sich Entwickler verstärkt auf andere Aufgaben in der Softwareentwicklung konzentrieren, und eine häufige Fehlerquelle in nativen Programmen wird ausgeschaltet.

  • Während für Microsoft sicher nicht die Möglichkeit im Vordergrund stand, .NET-Programme auf anderen Betriebssystemen ausführen zu können, spielt die Portabilität von Programmen quer über unterschiedliche Hardwareplattformen eine größere Rolle. Auch wenn viele Desktop-Computer weiterhin auf x86-Chips basieren, so gibt es zum Beispiel im Markt für Handys und andere Geräte für die Hosentasche eine wesentlich größere Zahl unterschiedlicher Hardwareplattformen. Anstatt alle Programme jeweils für eine neue Hardwareplattform anzupassen, reicht es nun aus, lediglich die .NET-Plattform an die Hardware anzupassen. Weil die .NET-Plattform die immer gleiche virtuelle Maschine simuliert, laufen alle .NET-Programme ohne Anpassung auf einem neuen Gerät.

Als Microsoft im Jahr 2002 die erste Version der .NET-Plattform veröffentlichte und zum Download freigab, gab es bereits etwas ähnliches: Java definiert ebenfalls eine virtuelle Maschine, vereinfacht die Softwareentwicklung unter anderem dank eines Garbage Collectors, steht auf zahlreichen Betriebssystemen und Hardwareplattformen zur Verfügung - und existiert seit 1995. Die .NET-Plattform sieht in ihren Grundzügen Java verdächtig ähnlich, und Microsoft wurde teilweise vorgeworfen, Java kopiert zu haben. Microsoft hat sich sicherlich den Erfolg von Java zu Herzen genommen und von Java gelernt. Bevor Microsoft aber die .NET-Plattform entwickelte, gab es eine andere Technologie, auf der sämtliche heute existierenden Microsoft-Produkte basieren und die den Vorgänger der .NET-Plattform darstellt.

Das Component Object Model, kurz COM, wurde von Microsoft rund 10 Jahre vor der .NET-Plattform entwickelt. Alle großen Softwareanwendungen von Microsoft Office über den Internet Explorer bis hin zu Entwicklungsumgebungen wie Visual Studio basieren auf COM. COM war für Microsoft die entscheidende Technologie, um umfangreiche Softwareprogramme komponentenorientiert zu entwickeln. Die Grundidee ist dabei, anstatt riesiger Programme kleine, unabhängige Komponenten zu entwerfen, die dann zu größeren Programmen zusammengesetzt werden können. Dies soll nicht nur die Entwicklung großer Programme vereinfachen. Da Komponenten unabhängig sind, können sie wiederverwendet werden, um sie beispielsweise in anderen Programmen einzusetzen.

Die COM-Technologie erwies sich als großer Erfolg - so groß, dass Microsoft nicht plant, die COM-Technologie in allen bisher auf COM-basierenden Programmen aufzugeben. So werden zum Beispiel alle Microsoft Office-Programme auch zukünftig auf COM setzen.

So wichtig COM für Microsoft wurde, traten dennoch zahlreiche Probleme auf. So ist zum Beispiel die Einstiegshürde für Entwickler recht hoch, um COM-Komponenten zu erstellen. Die COM-Technologie erfordert große Aufmerksamkeit in der Entwicklung, da sich aufgrund der komplizierten Spezifikation sehr leicht Fehler in den Code einschleichen können. COM funktioniert, ist aber keine Technologie, mit der man sich mal eben fünf Minuten beschäftigt, um dann seine erste COM-Komponente zu entwickeln.

Von diesem Blickwinkel aus gesehen stellt die .NET-Plattform die logische Weiterentwicklung von COM dar: Die komponentenorientierte Entwicklung wird auf eine neue Stufe gestellt, die all das wesentlich einfacher machen soll, was vorher bereits mit COM möglich war.

Die .NET-Plattform ermöglichte Microsoft einen Neuanfang, der die Entwicklung einer neuen Programmiersprache beinhaltete: C# wurde speziell für die .NET-Plattform entworfen. Während es möglich ist, .NET-Anwendungen in anderen Programmiersprachen zu entwickeln, wurde C# speziell für die Entwicklung von Anwendungen auf der .NET-Plattform designt. C# ist gewissermaßen die bevorzugte Programmiersprache der .NET-Plattform.


1.2 Sprachmerkmale von C#

C# als wichtigste Sprache für die .NET-Plattform

Während Microsoft C# so wie die .NET-Plattform von Grund auf neu gestalten konnte, orientierte man sich selbstverständlich an dem, was sich in anderen Programmiersprachen bewährt hat:

  • C# ist eine objektorientierte Programmiersprache, die sich an die Syntax von C++ anlehnt. Da viele Entwickler sowohl mit der Objektorientierung als auch mit C++ vertraut sind, fällt ihnen der Einstieg in die Entwicklung mit C# leicht.

  • Es wurde Wert auf eine komponentenorientierte Entwicklung gelegt - so wie es die COM-Technologie tat, mit der Microsoft erfolgreich sehr große Softwareanwendungen entwickeln konnte.

  • Die generische Programmierung wird unterstützt, die die Wiederverwendung von Code mit unterschiedlichen Datentypen gestattet - etwas, was auch in anderen Programmiersprachen wie C++ möglich ist.

Viele Sprachmerkmale von C# sind genaugenommen keine Eigenschaften dieser Programmiersprache, sondern Eigenschaften der .NET-Plattform. So wird zum Beispiel die generische Programmierung explizit durch die .NET-Plattform unterstützt. Als wichtigste Programmiersprache der .NET-Plattform unterstützt C# selbstverständlich ebenfalls die generische Programmierung. Sie können aber auch durchaus in anderen .NET-Programmiersprachen generisch programmieren.

Viele Sprachmerkmale von C# gelten außerdem auch für die Programmiersprache Java. Auch hier ist die Ähnlichkeit von C# und Java nicht von der Hand zu weisen. So fällt es Entwicklern, die mit Java vertraut sind, üblicherweise leicht, C# zu erlernen. Nicht nur die Konzepte ähneln sich, sondern auch die Syntax der Programmiersprachen.

Eine Besonderheit von C# ist jedoch, dass Microsoft in der Entwicklung von C# recht pragmatisch vorgeht. Die Sprache wird im Allgemeinen sehr schnell weiterentwickelt, was bedeutet, dass recht zügig neue Sprachmerkmale aufgenommen werden, wenn sie nützlich erscheinen. Es stehen keine theoretischen Überlegungen im Weg, wie die Sprache idealerweise designt werden sollte - der praktische Nutzen steht im Vordergrund. So wurde zum Beispiel die generische Programmierung in der ersten Version von C# nicht unterstützt, dann aber rasch in die zweite Version der Programmiersprache aufgenommen.

Die rasante Entwicklung der Programmiersprache C# lässt sich auch daran erkennen, dass es seit der ersten Version, die erstmals im Jahr 2000 von Microsoft der Öffentlichkeit vorgestellt wurde, zwei weitere Versionen gab und die vierte Version voraussichtlich Ende 2009 fertiggestellt sein wird. Bei anderen Programmiersprachen wie beispielsweise C++ kann es mehr als zehn Jahre dauern, bis eine neue Version vorliegt.

Trotz der raschen Weiterentwicklung der Programmiersprache besteht aber auch C# aus Bestandteilen, wie es sie seit Jahrzehnten in anderen Programmiersprachen gibt:

  • Mit Kontrollstrukturen kann die Codeausführung verzweigt werden, um in Abhängigkeit einer Bedingung unterschiedlichen Code auszuführen oder Code in einer Schleife wiederholt auszuführen. Es gibt praktisch keine Programmiersprache, die keine Kontrollstrukturen kennt. So tauchen die aus anderen Programmiersprachen bekannten Schlüsselwörter wie if, for und while in C# wieder auf.

  • Mit Operatoren können Variablen verknüpft werden. So ist zum Beispiel das Plus-Zeichen derart definiert, dass bei einer Verknüpfung von zwei Zahlen eine Addition ausgeführt wird - so wie typischerweise in jeder anderen Programmiersprache auch. C# gestattet darüberhinaus wie C++ das sogenannte Überladen von Operatoren, also die Neudefinition von Operatoren für bestimmte Datentypen.

  • Ausnahmen stellen einen Mechanismus dar, um dem Aufrufer einer Funktion mitzuteilen, dass es einen schwerwiegenden Fehler gab und die Ausführung der Funktion abgebrochen werden muss. Auch hier gilt: Wer C++ oder Java kennt, ist mit Ausnahmen bereits vertraut.

Sie lernen in diesem Buch C# in der Version 3.0 kennen. C# 4.0 ist von Microsoft angekündigt worden, steht aber noch nicht als fertige Version für den Produktiveinsatz zur Verfügung. Alles, was C# 3.0 definiert, behält in C# 4.0 aber seine Gültigkeit, so dass Sie, wenn die neue Version von C# erscheint, sich lediglich mit den Neuheiten vertraut machen müssen, um wieder auf dem aktuellen Stand zu sein.


1.3 Visual Studio und andere Entwicklungsumgebungen

Visual C# Express als kostenlose Entwicklungsumgebung

Microsoft hat mit seinen Spezifikationen für die .NET-Plattform und die Programmiersprache C# klar definiert, wie die Laufzeitumgebung von .NET-Programmen aussieht und wie mit C# .NET-Programme entwickelt werden können. Die .NET-Plattform steht außerdem als kostenloser Download für zahlreiche Windows-Betriebssysteme zur Verfügung. Womit aber sollen Programme für die .NET-Plattform erstellt werden? Wo soll der C#-Quellcode eingegeben werden?

Screenshot von Visual C# 2008 Express

Als Hersteller eines Betriebssystems und zahlreicher Anwendungsprogramme ist Microsoft auf Entwicklungswerkzeuge angewiesen. Microsoft entwickelt diese selber und bietet sie im Paket mit einer sogenannten Entwicklungsumgebung anderen Entwicklern an. Dieses Paket ist unter dem Namen Visual Studio bekannt.

Es gibt zahlreiche Editionen von Visual Studio, die sich in Inhalt und Umfang unterscheiden. So können sich Entwickler für genau die Edition entscheiden, die die Entwicklungwerkzeuge beinhaltet, die sie brauchen.

Während Microsoft Visual Studio über lange Zeit ausschließlich kommerziell angeboten hat, gibt es seit wenigen Jahren abgespeckte, aber kostenlose Editionen. Diese können wie die .NET-Plattform von Microsofts Website heruntergeladen werden, um erste Schritte mit Visual Studio zu machen und sich die Entwicklung von Programmen für die .NET-Plattform in aller Ruhe anzuschauen.

Neben Visual Studio stehen alternative Entwicklungsumgebungen wie zum Beispiel SharpDevelop oder MonoDevelop zur Verfügung. Beide genannten Entwicklungsumgebungen können kostenlos heruntergeladen werden. Kommerzielle Entwicklungsumgebungen für C# existieren neben Visual Studio momentan keine. Der noch vor wenigen Jahren von Codegear entwickelte C#Builder wurde eingestellt, um sich verstärkt auf die Programmiersprache Delphi für die .NET-Plattform zu konzentrieren.

Um die in diesem Buch enthaltenen Quellcodebeispiele nachzuvollziehen und Aufgaben zu lösen, wird der Einsatz der kostenlosen Entwicklungsumgebung Visual C# 2008 Express empfohlen. Es handelt sich hierbei um die aktuelle Version, die die Entwicklung von .NET-Programmen mit C# 3.0 unterstützt. Wenn Sie eine kommerzielle Version von Visual C# oder Visual Studio besitzen, können Sie dieses Buch selbstverständlich auch mit dieser Version durcharbeiten.


1.4 Mein erstes C#-Programm

Hallo, Welt!

Traditionell wird, wenn in die Entwicklung mit einer neuen Programmiersprache eingestiegen wird, ein Programm vorgestellt, das einfach nur Hallo, Welt! ausgibt. Das Programm, dessen Quellcode Sie im Folgenden sehen, tut genau das.

using System; 

class Program 
{ 
  static void Main(string[] args) 
  { 
    Console.Out.WriteLine("Hallo, Welt!"); 
  } 
} 

Oben sehen Sie das kleinstmögliche C#-Programm, um Hallo, Welt! auf den Bildschirm auszugeben. Um dieses Programm auszuführen, müssen Sie in Visual C# ein neues Projekt vom Typ Konsolenanwendung erstellen und obigen Quellcode einfügen. Drücken Sie dann auf die Taste F5. Der Quellcode wird daraufhin kompiliert, um eine exe-Datei zu erzeugen, die auf der .NET-Plattform ausgeführt werden kann. Konnte der Quellcode erfolgreich kompiliert werden, wird das Programm anschließend sofort ausgeführt.

Da obiges Programm nichts anderes tut als Hallo, Welt! auszugeben, erscheint das Fenster, das Visual C# öffnet und in das die Ausgabe erfolgt, nur für einen kurzen Moment - es wird automatisch geschlossen, wenn das Programm beendet wird. Wenn Sie verhindern möchten, dass das Fenster mit der Datenausgabe so schnell geschlossen wird, dass Sie es gar nicht zu sehen bekommen, fügen Sie nach Console.Out.WriteLine("Hallo, Welt!"); eine neue Zeile mit Console.In.Read(); ein. Diese Zeile bewirkt, dass Sie nach der Ausgabe von Hallo, Welt! Enter drücken müssen, damit das Programm beendet und das Ausgabefenster geschlossen wird.

Wahlweise können Sie das Programm, das von Visual C# kompiliert wurde, auch über die Eingabeaufforderung starten. Sie finden es im Unterverzeichnis bin\Release oder bin\Debug Ihres Projektverzeichnisses und erkennen es an der Endung exe. So können Sie, wenn Sie die Eingabeaufforderung starten, in das entsprechende Verzeichnis wechseln und es ausführen, indem Sie den Programmnamen eingeben und Enter drücken. In diesem Fall benötigen Sie keine Zeile mit Console.In.Read();, weil Sie die Eingabeaufforderung explizit schließen müssen, damit sie verschwindet.

Wenn Sie sich den Quellcode des obigen Programms ansehen, sehen Sie eine Struktur und Schlüsselwörter, wie sie üblicherweise in sehr vielen in C# entwickelten Programmen auftauchen. So besteht obiges Programm aus einer Klasse namens Program. Sie erkennen das daran, dass Program das Schlüsselwort class voransteht. Sie werden später im Detail erfahren, was Klassen sind. Momentan ist nur wichtig, dass Sie grundsätzlich verstehen, wie ein Programm aufgebaut ist, weil es nicht möglich ist, in C# Programme ohne Klassen zu entwickeln. So muss im obigen Programm also auf das Schlüsselwort class zugegriffen werden, um eine Klasse zu definieren.

Beachten Sie, dass der Klassenname hier keine Rolle spielt und Sie die Klasse beliebig nennen können. Wichtig ist viel mehr, dass die Klasse eine Methode namens Main() definiert. Achten Sie unbedingt auf Groß- und Kleinschreibung, da dies in C# eine Rolle spielt: Main() wird mit einem großen M geschrieben.

Es muss nicht nur eine Methode namens Main() existieren. Diese Methode muss außerdem als einen Parameter ein Array vom Typ string erwarten, einen Rückgabewert vom Typ void besitzen und statisch sein. Das erkennen Sie am Schlüsselwort static, das vor der Methode steht. Auch diese Details werden Ihnen später im Buch in aller Ausführlichkeit vorgestellt. Wichtig ist im Moment nur, dass Sie das Grundgerüst verstehen, das notwendig ist, um C#-Programme zu entwickeln.

Sowohl die Klasse als auch die Methode werden über ein Paar geschweifter Klammern definiert: Auf jede geöffnete geschweifte Klammer muss eine geschlossene geschweifte Klammer folgen. Wie Sie anhand der Klammern oben sehen können, ist die Definition der Methode Main() innerhalb der Definition der Klasse Program enthalten. Das ist insofern wichtig als dass in C# Methoden niemals außerhalb von Klassen definiert sein dürfen. Sie müssen Methoden immer innerhalb der geschweiften Klammern einer Klasse definieren.

In der Methode Main() findet ein Zugriff auf den Ausgabestream Out der Konsole statt. Die Konsole wird durch die Klasse Console repräsentiert. Indem für den Ausgabestream Out eine Methode WriteLine() aufgerufen wird und ihr die Zeichenkette "Hallo, Welt!" übergeben wird, wird sie auf den Bildschirm ausgegeben.

Wenn das Programm ausgeführt wird, wird die Methode Main() aufgerufen und all das ausgeführt, was in der Methode Main() angegeben ist. Da in diesem Beispiel lediglich ein Zugriff auf die Konsole stattfindet, um "Hallo, Welt!" auszugeben, passiert nicht mehr. Ist die Methode Main() ausgeführt worden, ist das Programm zu Ende. Die Methode Main() ist für alle Windows-Programme, die mit C# entwickelt werden, der Einstiegspunkt, an dem das Programm zu laufen beginnt.

Sie sind eventuell überrascht, warum die Ausgabe von Hallo, Welt! in einer schlichten schwarzen Box erscheint und nicht in einem ansprechenden Windows-Fenster mit Titelleiste und Menü, so wie Sie es von vielen Windows-Anwendungen gewohnt sind. Der Grund ist die Konsole. Die Konsole - von Microsoft auch Eingabeaufforderung genannt - ist zwar lediglich eine wenig ansprechende schwarze Box. Dafür können Sie über diese Konsole sehr einfach Daten ein- und ausgeben. Das sieht zugegebenermaßen nicht hübsch aus. Möchten Sie jedoch ein Windows-Fenster mit Titelleiste und Menü sehen, müssen Sie dieses selbst entwickeln. Für kleinere Programme lohnt sich der Aufwand nicht, da die Konsole automatisch zur Verfügung steht. Sie sieht zwar bei weitem nicht modern und zeitgemäß aus, ist für Beispielprogramme oder zum Testen aber sehr praktisch.

Nachdem Sie ein C#-Programm kennengelernt haben, das Daten ausgibt, sehen Sie im Folgenden ein Programm, das Sie zur Eingabe Ihres Namens auffordert.

using System; 

class Program 
{ 
  static void Main(string[] args) 
  { 
    Console.Out.WriteLine("Wie heißen Sie?"); 
    string s = Console.In.ReadLine(); 
    Console.Out.WriteLine("Hallo, " + s + "!"); 
  } 
} 

Wenn Sie obiges Programm ausführen und Ihren Namen eingeben, werden Sie begrüßt. So gibt das Programm, wenn Sie Boris eingeben, Hallo, Boris! aus.


1.5 Das .NET-Framework

Ein Werkzeugkasten mit unzähligen Tools

Sie haben soeben zwei Programme kennengelernt, die Daten ein- und ausgeben. Dazu wurde auf die Konsole zugegriffen, die durch eine Klasse Console automatisch zur Verfügung steht. Es stellt sich die Frage, wo die Klasse Console herkommt, dass sie einfach so verwendet werden kann.

Microsoft stellt Ihnen mit der .NET-Plattform nicht nur eine virtuelle Maschine zur Verfügung, sondern zusätzlich das sogenannte .NET-Framework. Genaugenommen nennt Microsoft das Gesamtpaket auch so: Wenn Sie die Website von Microsoft öffnen, wird Ihnen immer wieder der Begriff des .NET-Frameworks begegnen. In diesem .NET-Framework steckt natürlich auch die .NET-Plattform drinnen. Diese ist zwigend notwendig, um .NET-Programme ausführen zu können. Das .NET-Framework ist aber mehr als diese Plattform. Was genau soll man sich aber unter dem Begriff Framework vorstellen?

Sie hatten zu Beginn dieses Kapitels erfahren, dass die Definition einer neuen Plattform es Microsoft ermöglichte, keine Rücksicht mehr auf die Abwärtskompatibilität zu nehmen. Microsoft hat sich daher entschlossen, mit dem .NET-Framework eine neue und einfachere Schnittstelle zu entwickeln, um von .NET-Anwendungen auf Betriebssystemfunktionen zuzugreifen. Dazu wurden zahlreiche Klassen definiert, zu denen auch Console zählt. Alle diese Klassen hat Microsoft in einen Werkzeugkasten gepackt, der .NET-Entwicklern automatisch zur Verfügung steht. Dieser Werkzeugkasten heißt .NET-Framework.

In der aktuellen Version des .NET-Frameworks existieren mehrere tausend Klassen. Um in diesem großen Werkzeugkasten die richtigen Klassen zu finden und nicht die Übersicht zu verlieren, befinden sich alle Klassen in Namensräumen. Namensräume können verschachtelt sein, so dass Klassen Kategorien zugeordnet werden können. So gibt es beispielsweise einen Namensraum System, in dem sich weitere Namensräume wie System.Printing und System.Text befinden. Während Klassen im Namensraum System recht allgemeine Klassen für den Zugriff auf das Computersystem sind, kann über die Klassen im Namensraum System.Printing auf Druckdienste zugegriffen werden. Die Klassen im Namensraum System.Text wiederum ermöglichen die Konvertierung von Texten in unterschiedlichen Formaten.

Im obigen Beispiel, das Hallo, Welt! ausgegeben hat, wurde eine Klasse Console verwendet. Diese Klasse ist von Microsoft im .NET-Framework definiert worden und liegt im Namensraum System. Sie müssen bei einem Zugriff auf eine Klasse auch immer mitangeben, in welchem Namensraum sich diese Klasse befindet, damit sie gefunden werden kann. Im obigen Beispiel wurde Console automatisch im Namensraum System gefunden, weil die erste Zeile im Programm using System; lautet. Über das Schlüsselwort using sagen Sie dem Compiler, dass er auf der Suche nach Klassen in dem Namensraum nachschauen soll, der hinter using angegeben ist.

Sie müssen using nicht verwenden, sondern können den Namensraum auch dem Klassennamen voranstellen.

namespace MyFirstCSharpProgram 
{ 
  class Program 
  { 
    static void Main(string[] args) 
    { 
      System.Console.Out.WriteLine("Hallo, Welt!"); 
    } 
  } 
} 

Wenn Sie obiges Programm starten, wird wieder Hallo, Welt! auf die Konsole ausgegeben. In diesem Fall wird auf die Konsole aber über System.Console zugegriffen, so dass der Compiler nicht mehr selbst nachschauen muss, in welchem Namensraum sich die Klasse Console befindet. In der Praxis wird jedoch üblicherweise using verwendet, um nicht wiederholt den Namensraum mitangeben zu müssen, wenn auf eine Klasse zugegriffen wird.

Obiges Programm hat noch eine zweite Änderung erfahren: Die Klasse Program befindet sich nun in einem selbst definierten Namensraum namens MyFirstCSharpProgram. Dazu wurde die Klasse innerhalb der geschweiften Klammern definiert, die den Namensraum kennzeichnen. Sie erkennen die Definition des Namensraums am Schlüsselwort namespace. Auf diese Weise können Sie so, wie Microsoft es im .NET-Framework getan hat, in größeren Programmen, die Sie entwickeln, für Übersicht sorgen und Klassen in Namensräumen gruppieren.


1.6 Anwendungstypen

Von Windows-Anwendungen über Web-Applikationen bis hin zu Spielen

Die in diesem Kapitel kennengelernten Beispielprogramme gaben eine Meldung auf die Konsole aus. Es handelte sich um Programme vom Typ Konsolenanwendung. Selbstverständlich ist es möglich, herkömliche Windows-Anwendungen mit Titelleiste und Menü zu entwickeln.

Von Visual C# 2008 Express unterstützte Anwendungstypen

Wenn Sie in Visual C# 2008 Express ein neues Projekt erstellen, müssen Sie sich für eine Anwendungsart entscheiden:

  • Konsolenanwendungen bieten sich an, wenn Sie nicht selbst eine Benutzeroberfläche erstellen wollen. Ihr Programm kann dann Daten über die Konsole einlesen und ausgeben. Für Beispielprogramme oder um etwas schnell zu testen ist das sehr hilfreich.

  • Bei Windows-Forms Anwendungen kann und muss die Benutzeroberfläche selbst erstellt werden. Sie verwenden diesen Anwendungstypen, wenn Sie eine grafische Benutzeroberfläche bestehend aus einem Fenster mit Titelleiste und Menü entwickeln möchten. Wie Sie im Laufe dieses Buchs noch sehen werden, bietet Visual C# jedoch einen Editor an, mit dem Fenster gezeichnet werden können.

  • Eine Klassenbibliothek ist kein Programm, das ausgeführt werden kann, sondern stellt als eine Art benutzerdefinierter Werkzeugkasten anderen .NET-Programmen Klassen zur Verfügung. Sie erkennen Klassenbibliotheken an der Dateiendung dll.

  • Mit einer WPF-Anwendung können ähnlich wie mit Windows-Forms Anwendungen grafische Benutzeroberflächen erstellt werden. Während Windows-Forms jedoch seit der ersten Version Bestandteil des .NET-Frameworks sind, werden WPF-Anwendungen erst seit der Version 3.0 unterstützt. WPF steht für Windows Presentation Foundation und ist ein umfassender Ansatz, jegliche Art der Präsentation von Daten in Anwendungen zu unterstützen. Dazu zählen unter anderem Grafiken, Animationen, Videos, 2D- und 3D-Darstellungen. Für Anwendungen, für die die Darstellung der grafischen Benutzeroberfläche oder von Daten in dieser besonders wichtig ist, kann WPF eine gute Wahl sein.

  • WPF-Browseranwendungen basieren so wie WPF-Anwendungen auf der Windows Presentation Foundation, laufen jedoch innerhalb des Browsers ab. Da WPF-Browseranwendungen auch auf dem .NET-Framework basieren, muss jedoch auf jedem Computer, auf dem eine derartige Anwendung im Browser ausgeführt werden soll, das .NET-Framework installiert sein. Da selbst dann momentan außerdem nur der Internet Explorer in der Lage ist, WPF-Browseranwendungen auszuführen, macht es keinen Sinn, derartige Anwendungen im Internet einsetzen. In firmeninternen Netzwerkumgebungen, wo jeder Computer mit dem .NET-Framework ausgerüstet ist und der Internet Explorer als Standardbrowser verwendet wird, stellen WPF-Browseranwendungen eine Alternative zu anderen Technologien dar, mit denen Web-Applikationen entwickelt werden können.

In der kostenlosen Express Edition von Visual C# 2008 werden nicht mehr Anwendungstypen angeboten. Die kommerziellen Editionen von Visual Studio unterstützen jedoch weitere Anwendungstypen. So können ASP.NET-Webseiten erstellt werden, die dynamisch auf Seiten des Webservers Daten verarbeiten, bevor eine Webseite an den Browser geschickt und dort angezeigt wird. Es können Webdienste basierend auf XML entwickelt werden, mit denen netzwerkübergreifend Funktionen aufgerufen werden können. Es ist sogar möglich, mit C# Spiele zu entwickeln, die nicht nur unter Windows, sondern auch auf Microsofts Spielekonsole XBox 360 laufen. Das entsprechende Entwicklungswerkzeug XNA Game Studio kann sogar als kostenlose Erweiterung für Visual C# 2008 Express installiert werden.


1.7 Buchaufbau

Gesamtverständnis vor zu vielen Details

In diesem Buch werden Sie in die Softwareentwicklung mit C# eingeführt. Da C# eine sehr umfangreiche Programmiersprache ist und das .NET-Framework ebenfalls nicht als klein bezeichnet werden kann, steht in diesem Buch das Gesamtverständnis von der Softwareentwicklung mit C# im Vordergrund. So werden Sie zum Beispiel kein Kapitel finden, in dem Sie mit sämtlichen Operatoren in C# vertraut gemacht werden. Solche Details können Sie sich später problemlos innerhalb kurzer Zeit selbst aneignen, indem Sie sie beispielsweise im C#-Programmierhandbuch von Microsoft nachschlagen.

Viel wichtiger ist, dass Sie nach dem Lesen dieses Buchs wissen, wie Sie grundsätzlich vorgehen müssen, um objektorientierte und komponentenorientierte Programme in C# zu entwickeln und sich dabei modernster Hilfsmittel wie Generika und LINQ-Abfragen bedienen können. Mit diesem Wissen ausgerüstet sollten Sie in der Lage sein, .NET-Programme zu entwickeln, die aus dem Vollen schöpfen und mehr sind als Spielereien, die aus wenigen Code-Zeilen bestehen.

Dieses Buch soll Sie also schnell ans Ziel bringen, eigene .NET-Programme in C# entwickeln zu können. Dabei wird wie folgt vorgegangen:

  • Da C# eine objektorientierte Programmiersprache ist und die Objektorientierung zwingend eingesetzt werden muss, werden Sie in den beiden folgenden Kapiteln mit der Objektorientierung bekannt gemacht: Während sich das Kapitel 2, Objektorientierung vor allem um die der Objektorientierung zugrundeliegenden Konzepte dreht, lernen Sie im Kapitel 3, Objektmerkmale verschiedene Objektmerkmale näher kennen.

  • In C# basieren Objekte auf Klassen, die in Bezug zueinander gesetzt werden können. Auf diese Weise entstehen Klassenhierarchien, die Sie im Kapitel 4, Klassenhierarchien kennenlernen werden. Klassenhierarchien sind vor allem deswegen wichtig, weil alle Klassen im .NET-Framework in eine einzige große Klassenhierarchie eingeordnet sind und Sie mit dieser Klassenhierarchie zwangsläufig in Berührung kommen.

  • Wenn Sie Klassen entwickeln, können Sie diese in Form von Quellcode anderen Entwicklern zur Verfügung stellen - oder in Komponenten verpackt als Binärcode. Das hat unter anderem den Vorteil, dass derartige Komponenten sogar in .NET-Programmen verwendet werden können, die nicht in C# programmiert sind. Komponenten spielen auch eine entscheidende Rolle, wenn Sie Windows-Anwendungen mit grafischen Benutzeroberflächen entwickeln. All dies lernen Sie im Kapitel 5, Komponenten kennen.

  • Wenn Sie grafische Benutzeroberflächen entwickeln, sind Sie sehr schnell bei der Ereignisverarbeitung. Denn üblicherweise möchten Sie auf Benutzereingaben wie zum Beispiel Mausklicks reagieren. Wie das funktioniert, wird Ihnen im Kapitel 6, Ereignisse gezeigt.

  • Während Sie nun wissen, wie Sie Windows-Anwendungen entwickeln können, wird Ihnen im Kapitel 7, Generika gezeigt, wie Generika Ihnen helfen, Ihren Code zu vereinfachen und gleichzeitig sicherer und flexibler zu machen. Da im .NET-Framework viele Generika-Klassen zur Verfügung gestellt werden, sollten Sie mit Generika vertraut sein, um sämtliche vom .NET-Framework angebotenen Hilfsmittel verstehen und einsetzen zu können.

  • Im Kapitel 8, LINQ werden Sie in LINQ-Abfragen eingeführt - einer Erweiterng der Programmiersprache C#, die erst seit der aktuellen Version 3.5 existiert. Dieses neue Werkzeug ermöglicht Ihnen, beliebige Datenbeständen auf einfache Art und Weise zu verarbeiten. Da fast jede Anwendung in irgendeiner Form Daten verwalten muss, stellen LINQ-Abfragen ein in der Praxis nützliches Werkzeug dar.

  • Abschließend lernen Sie in diesem Buch die Ausnahmebehandlung kennen. Ausnahmen sind deswegen wichtig, weil sie unbehandelt zum Absturz Ihrer Programme führen können. Welchen Sinn Ausnahmen haben und wie Sie sie abfangen können, lernen Sie im Kapitel 9, Ausnahmen kennen.

Es wird empfohlen, die Kapitel der Reihe nach zu lesen. Während die Kapitel jeweils bestimmte Themenkomplexe abgeschlossen behandeln, bauen sie dennoch aufeinander auf. Das wird vor allem bei den Beispielen deutlich. So wird in diesem Buch Schritt für Schritt ein Browser entwickelt. Während anfangs nur mit einer Klasse Uri gearbeitet wird, um WWW-Adressen zu speichern, wird später eine grafische Benutzeroberfläche erstellt, in der die Komponente des Internet Explorers eingebettet wird. Um die Beispiele besser nachvollziehen zu können, ist es daher empfehlenswert, die Kapitel in der vorgesehenen Reihenfolge zu lesen.