C# für Dummies - Steffen Steinbrecher - E-Book

C# für Dummies E-Book

Steffen Steinbrecher

0,0
24,99 €

-100%
Sammeln Sie Punkte in unserem Gutscheinprogramm und kaufen Sie E-Books und Hörbücher mit bis zu 100% Rabatt.

Mehr erfahren.
Beschreibung

C# ist eine der am meisten genutzten Programmiersprachen, doch wie den Ein- oder Umstieg schaffen? Genau dabei hilft Ihnen dieses Buch. Nachdem Sie sich zunächst die notwendigen Grundlagen erarbeitet haben, lernen Sie auch alles Notwendige über LINQ, XML und ADO.NET. Anschließend werden Sie sicher durch das Schreiben Ihrer ersten eigenen .NET-Anwendung geleitet. Noch nicht genug? Kapitel zu fortgeschrittenen .NET-Techniken wie die dynamische Programmierung oder die Task Parallel Library runden das Buch ab.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern

Seitenzahl: 579

Veröffentlichungsjahr: 2020

Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



C# für Dummies

Schummelseite

SCHLÜSSELWÖRTER

Die Programmiersprache C# besitzt über 100 Schlüsselwörter. Bei Schlüsselwörtern handelt es sich um vordefinierte reservierte Bezeichner, die eine besondere Bedeutung innerhalb der Sprache haben.

Die folgende Tabelle listet die Schlüsselwörter von C# auf.

Schlüsselwort

Was es bewirkt

abstract

Das Schlüsselwort gibt an, dass die Klasse beziehungsweise die Klassenelemente keine Implementierung haben. Wird in einer Klassendeklaration verwendet, um anzugeben, dass die Klasse nur die Basisklasse für eine andere Klasse sein soll. Die Implementierung erfolgt dann in der abgeleiteten Klasse, eine abstrakte Klasse darf nicht instanziiert werden.

as

Der as-Operator kann verwendet werden, um bestimmte Typkonvertierungen oder Umwandlungen zwischen kompatiblen Referenztypen durchzuführen.

base

Das base-Schlüsselwort wird verwendet, um aus einer abgeleiteten Klasse auf die Elemente der Basisklasse zuzugreifen (die Elemente einer Klasse werden sehr oft auch als Members bezeichnet). Wird immer dann gebraucht, wenn eine Methode der Basisklasse durch eine andere Methode überschrieben wurde.

bool

Das Schlüsselwort bool ist ein Alias von System.Boolean. Es wird zur Deklaration von Variablen zur Speicherung der booleschen Werte true und false verwendet.

break

Die break-Anweisung beendet die Ausführung der gerade ausgeführten Schleife oder switch-Anweisung.

byte

byte kennzeichnet eine 8-Bit-Ganzzahl ohne Vorzeichen und erlaubt das Speichern von Werten von 0 … 255.

case

Leitet einen von mehreren möglichen Ausführungspfaden in einer switch-Anweisung ein.

catch

Führt Anweisungen ein, die ausgeführt werden, wenn etwas den Ausführungsfluss in einer try-Klausel unterbricht.

char

Das Schlüsselwort char wird zur Deklaration einer Instanz der System.Char-Struktur verwendet, die ein Unicode-Zeichen repräsentiert (ein Buchstabe, eine Ziffer, ein Interpunktionszeichen usw.). Der Wert einer char-Variable ist ein numerischer 16-Bit-Wert (ordinal).

checked

Dieser Ausdruck wird verwendet, um eine Überlaufprüfung bei arithmetischen Operationen für ganzzahlige Typen und Konvertierungen explizit zu aktivieren.

class

Klassen werden mithilfe des Schlüsselworts class deklariert.

const

Das const-Schlüsselwort wird verwendet, um ein konstantes Feld oder eine konstante lokale Variable zu deklarieren. Konstante Felder und lokale Felder sind keine Variablen und können daher nicht geändert werden. Konstanten können Nummern, boolesche Werte, Zeichenfolgen oder ein null-Verweis sein.

continue

Die continue-Anweisung erzwingt den sofortigen Abbruch der aktuellen Schleifeniteration und beginnt mit der nächsten Iteration.

decimal

Das decimal-Schlüsselwort kennzeichnet einen 128-Bit-Datentyp. Im Vergleich zu anderen Gleitkommatypen verfügt der decimal-Typ über höhere Genauigkeit und einen kleineren Wertebereich. Dadurch eignet er sich für Finanz- und Währungskalkulationen.

default

In einer switch-Anweisung leitet das Schlüsselwort einen Ausführungspfad ein, der zu verfolgen ist, wenn kein case in der switch-Anweisung einen Treffer darstellt. Außerhalb einer switch-Anweisung wird das Schlüsselwort default als Standardwertausdruck verwendet. Ein Standardwertausdruck default(T) erzeugt den Standardwert für einen Typ T.

delegate

Ein delegate ist ein Referenztyp, der verwendet werden kann, um eine benannte oder anonyme Methode zu kapseln. Delegates entsprechen den Funktionszeigern in C++, sind jedoch typsicher und geschützt.

do

Die Anweisung do führt eine Anweisung oder einen Anweisungsblock aus, solange ein angegebener boolescher Ausdruck true ergibt (wird auch als do-Schleife bezeichnet).

double

Das double-Schlüsselwort kennzeichnet einen einfachen Typ, der 64-Bit-Gleitkommawerte speichert.

else

Führt Anweisungen aus, die ausgeführt werden, wenn die Bedingung in einer if-Anweisung nicht erfüllt ist.

enum

Erzeugt einen neuen Typ – eine Gruppe von Werten, die eine Variable annehmen kann. Der neue Typ wird auch Enumeration genannt.

event

Das event-Schlüsselwort wird verwendet, um ein Ereignis zu deklarieren.

explicit

Mit explicit wird ein benutzerdefinierter Typkonvertierungsoperator erzeugt, der mit einer Umwandlung aufgerufen werden muss.

extern

Der extern-Modifizierer wird verwendet, um eine extern implementierte Methode zu deklarieren. Der extern-Modifizierer wird häufig mit dem DllImport-Attribut verwendet, wenn Sie nicht verwalteten Code mit Interop-Diensten aufrufen.

false

Wird als ein überladener Operator oder als Literal verwendet, als Literal wird der boolesche Wert false zurückgeliefert.

finally

Wird in Verbindung mit dem Schlüsselwort try verwendet und wird immer durchlaufen, sogar wenn im try-Block eine Ausnahme aufgetreten ist. Im finally-Block können alle Ressourcen bereinigt werden, die in einem try-Block verwendet wurden.

fixed

Die fixed-Anweisung verhindert, dass der Garbage Collector eine Variable verschiebt. Die fixed-Anweisung ist nur in einem unsicheren (unsafe) Kontext zulässig.

float

Das float-Schlüsselwort kennzeichnet einen einfachen Typ, der 32-Bit-Gleitkommawerte speichert.

for

Die Anweisung for veranlasst den Computer, eine Anweisung oder einen Anweisungsblock mehrfach auszuführen (wird auch als for-Schleife bezeichnet).

foreach

Die Anweisung foreach führt eine Anweisung oder einen Block von Anweisungen für jedes Element einer Auflistung aus. Die Auflistung muss dafür die Schnittstelle System.Collections.IEnumerable oder System.Collections.Generic.IEnumerable<T> implementieren.

goto

goto ist eine Sprunganweisung oder ein Sprungbefehl. In C#-Programmen dient sie dazu, die Verarbeitung nicht mit dem nachfolgenden Befehl, sondern an einer explizit angegeben Stelle fortzuführen. Hinweis: sollte nicht mehr genutzt werden, ist nur noch aus Kompatibilitätsgründen im Sprachumfang.

if

Überprüft, ob eine Bedingung true ist. Ist sie true, führt das Programm bestimmte Anweisungen aus, andernfalls führt es andere Anweisungen aus (siehe else-Schlüsselwort).

implicit

Das implicit-Schlüsselwort wird verwendet, um einen impliziten benutzerdefinierten Typkonvertierungsoperator zu deklarieren.

in

in kann in verschiedenen Kontexten verwendet werden, beispielsweise in foreach-Schleifen.

int

int kennzeichnet einen ganzzahligen 32-Bit-Datentyp.

interface

Führt eine Schnittstelle (Interface) ein. Eine Schnittstelle enthält nur die Signaturen von Methoden, Eigenschaften, Ereignissen oder Indexern und keinerlei Implementierung.

internal

Das Schlüsselwort internal ist ein Zugriffsmodifizierer für Typen und Typmembers. Auf interne Typen oder Members kann nur innerhalb derselben Assembly zugegriffen werden.

is

Überprüft, ob ein Objekt mit einem angegebenen Typ kompatibel ist.

lock

Mit dem lock-Schlüsselwort wird sichergestellt, dass ein Thread nicht auf ein Objekt zugreift, während ein anderer Thread dieses Objekt bearbeitet. lock setzt also eine Sperre auf einen entsprechenden Codeabschnitt.

long

long kennzeichnet einen 64-Bit-Ganzzahltyp.

namespace

Das namespace-Schlüsselwort wird verwendet, um einen Gültigkeitsbereich zu deklarieren, der eine Gruppe von verwandten Objekten enthält.

new

Wird zum Erstellen von Objekten und zum Aufrufen von Konstruktoren verwendet, erzeugt also ein Objekt aus einer vorhandenen Klasse.

null

Das Schlüsselwort null ist ein Literal, das eine NULL-Referenz darstellt, die auf kein Objekt verweist. null ist der Standardwert einer Referenztypvariablen.

object

Der object-Typ ist ein Alias für Object in .NET. Im vereinheitlichten Typsystem von C# erben alle Typen, vordefiniert und benutzerdefiniert sowie Verweis- und Werttypen, direkt oder indirekt von Object.

operator

operator wird verwendet, um einen integrierten Operator zu überladen oder um eine benutzerdefinierte Konvertierung in einer Klassen- oder Strukturdeklaration bereitzustellen.

out

out ist ein Parametermodifizierer und bewirkt, dass Argumente per Verweis übergeben werden. Das Deklarieren einer Methode mit out-Argumenten ist nützlich, wenn eine Methode mehrere Werte zurückgeben soll.

override

Der override-Modifizierer wird benötigt, um die abstrakte oder virtuelle Implementierung einer geerbten Methode, Eigenschaft, eines Indexers oder Ereignisses zu erweitern oder zu überschreiben.

params

Mithilfe des Schlüsselworts params kann ein Methodenparameter angegeben werden, der eine variable Anzahl von Argumenten akzeptiert.

private

Das private-Schlüsselwort ist ein Zugriffsmodifizierer für Members und zeigt an, dass eine Variable oder Methode nur innerhalb der jeweiligen Klasse verwendet werden kann.

protected

Kennzeichnet Variablen und Methoden einer Klasse als protected (geschützt). Auf ein protected-Member kann nur innerhalb seiner Klasse und von Instanzen abgeleiteter Klassen zugegriffen werden.

public

Mit dem public-Schlüsselwort werden Variablen, Klassen oder Methoden als öffentlich gekennzeichnet. Es gibt keine Einschränkungen für den Zugriff auf öffentliche Members.

readonly

In einer Variablendeklaration gibt readonly an, dass die Zuweisung der Variable nur als Teil der Deklaration oder in einem Konstruktor derselben Klasse erfolgen kann. Danach kann die Variable nicht mehr geändert werden.

ref

Das ref-Schlüsselwort gibt einen Wert an, der als Referenz übergeben wird.

return

Beendet die Ausführung einer Methode und gibt gegebenenfalls einen Wert an den aufrufenden Code zurück.

sbyte

sbyte kennzeichnet einen ganzzahligen 8-Bit-Typ.

sealed

Der Modifizierer sealed verhindert, dass andere Klassen von einer Klasse erben, wenn er auf diese Klasse angewendet wird.

short

short kennzeichnet einen ganzzahligen 16-Bit-Datentyp.

sizeof

Wird verwendet, um die Größe eines nicht verwalteten Typs in Bytes abzurufen.

stackalloc

Das stackalloc-Schlüsselwort wird in einem unsicheren Codekontext verwendet, um einen Speicherblock auf dem Stapel (Stack) zu belegen.

static

Zeigt an, dass eine Variable oder Methode zu einer Klasse gehören, statt zu einem aus der Klasse erzeugten Objekt.

string

Der Typ string stellt eine Sequenz von 0 oder mehr Unicode-Zeichen dar.

struct

Ein struct-Typ ist ein ein Werttyp, der in der Regel verwendet wird, um eine kleine Gruppe verwandter Variablen zusammenzufassen, beispielsweise Koordinaten eines Rechtecks oder die Merkmale eines Lagerartikels.

switch

switch ist eine Auswahlanweisung, die vorgibt, abhängig vom Wert eines Ausdrucks einem von mehreren Anweisungspfade zu folgen (einem der möglichen case-Fälle).

this

Ein Selbstverweis – verweist auf die aktuelle Instanz der Klasse, in der das Schlüsselwort this verwendet wird.

throw

Signalisiert das Auftreten einer Ausnahme während der Programmausführung und zeigt somit an, dass eine außergewöhnliche Situation (in der Regel etwas Unerwünschtes) aufgetreten ist.

true

Stellt den booleschen Wert true für wahr dar.

try

Der try-Block enthält überwachten Code, der möglicherweise eine Ausnahme verursacht. Der Block wird ausgeführt, bis eine Ausnahme ausgelöst wird oder bis er erfolgreich abgeschlossen wird.

typeof

Kann dazu verwendet werden, um den Typ eines Objekts zur Laufzeit eines Programms zu ermitteln.

uint

Das Schlüsselwort uint kennzeichnet einen ganzzahligen, positiven 32-Bit-Typ.

ulong

ulong kennzeichnet einen ganzzahligen, positiven 64-Bit-Typ.

unchecked

Das Schlüsselwort unchecked wird verwendet, um eine Überlaufüberprüfung bei arithmetischen Operationen für ganzzahlige Typen und Konvertierungen zu unterdrücken.

unsafe

Das Schlüsselwort unsafe erzeugt einen unsicheren Kontext, der für alle Zeigeroperationen erforderlich ist.

ushort

ushort kennzeichnet einen ganzzahligen, positiven 16-Bit-Datentyp.

using

Hat zwei Hauptverwendungen: Als Direktive zum Importieren von Namensräumen oder als Anweisung, wenn ein Bereich definiert wird, an dessen Ende ein Objekt verworfen wird.

virtual

Erlaubt, dass eine Methoden-, Eigenschaften-, Indexer- oder Ereignisdeklaration in einer abgeleiteten überschrieben werden darf.

void

Zeigt an, dass eine Methode keinen Wert zurückgibt.

volatile

Das Schlüsselwort volatile gibt an, dass ein Feld von mehreren Threads geändert werden kann, die zur gleichen Zeit ausgeführt werden.

while

Die Anweisung while führt eine Anweisung oder einen Anweisungsblock immer wieder aus, solange ein angegebener boolescher Ausdruck true ergibt (while-Schleife).

C# für Dummies

Bibliografische Information der Deutschen Nationalbibliothek

Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.

© 2020 WILEY-VCH Verlag GmbH & Co. KGaA, Weinheim

Wiley, the Wiley logo, Für Dummies, the Dummies Man logo, and related trademarks and trade dress are trademarks or registered trademarks of John Wiley & Sons, Inc. and/or its affiliates, in the United States and other countries. Used by permission.

Wiley, die Bezeichnung »Für Dummies«, das Dummies-Mann-Logo und darauf bezogene Gestaltungen sind Marken oder eingetragene Marken von John Wiley & Sons, Inc., USA, Deutschland und in anderen Ländern.

Das vorliegende Werk wurde sorgfältig erarbeitet. Dennoch übernehmen Autoren und Verlag für die Richtigkeit von Angaben, Hinweisen und Ratschlägen sowie eventuelle Druckfehler keine Haftung.

Print ISBN: 978-3-527-71519-0

ePub ISBN: 978-3-527-81709-2

Coverfoto: © bluebay2014 – stock.adobe.com

Korrektur: Matthias Delbrück, Dossenheim/Bergstraße

Über den Autor

Steffen Steinbrecher beschäftigt sich seit über 15 Jahren mit der Softwareentwicklung. In dieser Zeit lag sein Hauptschwerpunkt auf der Programmiersprache C# und der .NET-Plattform. In seiner Freizeit betreibt er einen Blog zu allem, was die Programmiersprache C# betrifft.

Danksagung

Ich danke meiner Lektorin Andrea Baulig für die nette und verständnisvolle Betreuung während der Manuskripterstellung. Ganz besonders möchte ich mich bei Harald Binkle bedanken, dessen Anregungen diesem Buch den letzten Schliff gaben.

Inhaltsverzeichnis

Cover

Über den Autor

Danksagung

Einleitung

Über dieses Buch

Wie dieses Buch aufgebaut ist

Symbole, die in diesem Buch verwendet werden

Wie es weiter geht

Teil I: Los geht's

Kapitel 1: Grundlagen und Einführung

Grundlagen der Programmierung

.NET-Plattformarchitektur

Das Prinzip der objektorientierten Programmierung

Kapitel 2: Entwicklungswerkzeuge und Tools

Ein Programm erstellen

Microsoft Visual Studio 2019 Community Edition

Der Marktplatz für fertige Lösungen: NuGet

Kapitel 3: Das ABC der Sprache C#

Bezeichner

Kommentare

Datentypen, Variablen und Konstanten

Was ist eine Methode?

Namensräume

Kapitel 4: Operatoren und Programmsteuerung

Operatoren

Den Programmablauf steuern: Verzweigungen und Kontrollstrukturen

Vorgänge wiederholen: Schleifen

Kapitel 5: Zeichenfolgen, Arrays und Datumswerte

Zeichen und Zeichenfolgen

Arrays

Datums- und Zeitberechnungen

Kapitel 6: Objektorientierte Programmierung mit C#

Klassen, Eigenschaften und Methoden

Vererbung

Abstrakte Klassen

Interfaces

Kapitel 7: Fehler passieren, macht aber nichts: Ausnahmebehandlung

Mit Ausnahmen umgehen

Wie man einen Fehler »fängt«!

Ausnahmetypen

Fehler auslösen

Eigene Fehlerklassen erstellen

Kapitel 8: Weitere Sprachfeatures

Delegates

Anonyme Methoden

Lambda-Ausdrücke

Ereignisse – was geht ab?

Generics – generische Datentypen

Nette Helfer: Attribute

Sie wollen mehr? Erweiterungsmethoden

Teil II: Weitere Sprachfeatures von C#

Kapitel 9: Zugriffe auf das Dateisystem

Klassen für den Zugriff auf das Dateisystem

Praxisbeispiele

Kapitel 10: Dateizugriff und Streams

Arbeiten mit Dateien

Arbeiten mit Streams

Komprimieren von Dateien mit .NET-Klassen

Objekte serialisieren

Kapitel 11: Asynchrone und parallele Programmierung

Grundlagen und Begrifflichkeiten

Asynchrone Programmiermuster

Kapitel 12: Daten abfragen mit LINQ

LINQ-Grundlagen

Abfragen mit LINQ

Die wichtigsten Abfrageoperatoren

Praxisbeispiele

Kapitel 13: Grundlagen von ADO.NET

Vorbereitungen

Datenbankzugriffe mit ADO.NET

Das DataSet und der DataAdapter

Asynchrone Datenbankzugriffe

Teil III: Eine eigene C#-Anwendung schreiben

Kapitel 14: Fehlersuche und Softwarequalität

Welche Fehlerarten gibt es überhaupt?

Der Debugger

Codequalität verbessern

Kapitel 15: Benutzeroberfläche mit Windows Forms

Grundgerüst einer Windows-Forms-Anwendung

Benutzeroberfläche erstellen

Windows-Forms-Anwendung: Ja oder Nein?

Kapitel 16: Moderne Oberflächen mit WPF und XAML

Meine erste WPF-Anwendung

Ereignisse in WPF

Commands

Ressourcen in WPF

Das gewisse Etwas: Styles

Databinding – die Benutzeroberfläche mit Daten versorgen

Teil IV: Fortgeschrittene Techniken in C# und WPF

Kapitel 17: Fortgeschrittene Techniken rund um die WPF

Das Beispielprogramm

Das MVVM-Entwurfsmuster

Datenbeschaffung

Eigene Commands implementieren

Kapitel 18: Modulare Anwendung auf Basis von C# und WPF – ein Beispiel

Die Beispielanwendung

Vorbereitungen und Erstellung der Solution

Styling der Anwendung

Das Dependency-Injection-Entwurfsmuster

Dynamische Oberflächen mit Prism-Regionen

Erstellung eines Prism-Moduls

Austausch- und wiederverwendbare Komponenten

Fazit – Was haben Sie jetzt gewonnen?

Teil V: Der Top-Ten-Teil

Kapitel 19: Zehn Dinge in C#, die Sie wirklich lernen und verwenden sollten!

Initialisierer für Objekte und Collections

Automatisch implementierte Eigenschaften initialisieren

null-coalescing Operator ??

String-Interpolation für dynamische Zeichenfolgen

Null-conditional Operator

nameof()-Ausdruck

is- und as-Operatoren

Zeichenfolgen mit String.IsNullOrEmpty() überprüfen

break- und continue-Anweisung

TryParse für die Umwandlung von Zeichenketten

Kapitel 20: Zehn nützliche Open-Source-Projekte

MahApps.Metro: Verpassen Sie Ihrer Anwendung den Metro-Style

Modern UI for WPF (MUI)

MaterialDesignInXamlToolkit

Extended WPF Toolkit

WPFLocalizationExtension

ResXManager

Prism

Sammlung von Erweiterungsmethoden

Modern UI Icons

Material Design Icons

Stichwortverzeichnis

End User License Agreement

Tabellenverzeichnis

Kapitel 3

Tabelle 3.1: Übersicht Datentypen.

Tabelle 3.2: Typsuffixe in Verbindung mit dem

var

-Schlüsselwort.

Tabelle 3.3: Erlaubte implizite numerische Konvertierungen.

Tabelle 3.4: Mögliche explizite numerische Konvertierungen.

Tabelle 3.5: Wichtige Namensräume im .NET-Framework.

Kapitel 4

Tabelle 4.1: Arithmetische Operatoren.

Tabelle 4.2: Inkrement- und Dekrement-Operatoren.

Tabelle 4.3: Die verschiedenen Zuweisungsoperatoren.

Tabelle 4.4: Die verschiedenen Vergleichsoperatoren.

Tabelle 4.5: Boolesche Operatoren.

Kapitel 5

Tabelle 5.1: Wichtige Eigenschaften und Methoden zur Analyse von Zeichenfolgen.

Tabelle 5.2: Wichtige Methoden zur Manipulation von Zeichenfolgen.

Tabelle 5.3: Wichtige Escape-Sequenzen in C

#

.

Tabelle 5.4: Formatbezeichner für

DateTime

-Variablen.

Tabelle 5.5: Formatbezeichner für Zahlenwerte.

Tabelle 5.6: Wichtige Eigenschaften und Methoden von

Array

-Variablen.

Tabelle 5.7: Wichtige Methoden der

Array

-Klasse.

Tabelle 5.8: Wichtige Eigenschaften und Methoden der

DateTime

-Struktur.

Tabelle 5.9: Methoden zum Addieren von Datums- und Uhrzeitangaben.

Kapitel 6

Tabelle 6.1: Zugriffsmodifizierer zur Einschränkung der Sichtbarkeit.

Tabelle 6.2: Codeausschnitte für Eigenschaften in Microsoft Visual Studio.

Kapitel 7

Tabelle 7.1: Eigenschaften der

System.Exception

-Klasse.

Kapitel 9

Tabelle 9.1: Wichtige Klassen für die Arbeit mit Dateien und Verzeichnissen.

Tabelle 9.2: Ausprägungen der

SearchOption

-Enumeration.

Tabelle 9.3: Platzhalterzeichen für das Suchmuster.

Tabelle 9.4: Wichtige Methoden der

Path

-Klasse.

Kapitel 10

Tabelle 10.1: Methoden der

File

-Klasse, um Datei zu erstellen, zu lesen und zu än...

Tabelle 10.2: Methoden der abstrakten

Stream

-Klasse.

Tabelle 10.3: Wichtige

Stream

-Klassen.

Tabelle 10.4: Klassen für Komprimierung und Dekomprimierung.

Kapitel 11

Tabelle 11.1: Einige wichtige Werte der

TaskContinuationOptions

Enumeration (nich...

Tabelle 11.2: Mögliche Rückgabewerte einer asynchronen Methode.

Kapitel 12

Tabelle 12.1: Die wichtigsten LINQ-Aggregat-Operatoren (nicht vollständig).

Kapitel 13

Tabelle 13.1: Aufbau der Tabelle

categories

in der Northwind-Beispieldatenbank.

Tabelle 13.2: Die Werte der Enumeration

DataRowState

.

Tabelle 13.3: Die Enumeration

DataRowVersion

.

Tabelle 13.4: Aufbau der Tabelle

orders

in der Northwind-Beispieldatenbank.

Kapitel 14

Tabelle 14.1: Tastenkombinationen im Debug-Modus.

Kapitel 15

Tabelle 15.1: Verwendete Steuerelemente und ihre Eigenschaften.

Illustrationsverzeichnis

Kapitel 1

Abbildung 1.1: Ein Compiler übersetzt Quelltext in ausführbaren Maschinencode (*....

Abbildung 1.2: Ein Interpreter wertet den Quelltext direkt aus und wandelt ihn in...

Abbildung 1.3: Es gibt auch Programmiersprachen, die eine Kombination aus Compile...

Abbildung 1.4: Übersicht .NET-Plattform (High-Level).

Abbildung 1.5: Kompilierung eines .NET-Programms.

Abbildung 1.6: CIL-Code des ersten C

#

-Programms.

Abbildung 1.7: Wichtige Bestandteile des .NET-Frameworks.

Abbildung 1.8: Klassendiagramm für einen PKW.

Abbildung 1.9: Konkrete Objekte einer Klasse

PKW

zur Laufzeit eines Programms.

Abbildung 1.10: Klassendiagramm Fahrzeug und davon abgeleitete Klassen.

Kapitel 2

Abbildung 2.1: »HelloWord.cs« im Texteditor Notepad von Microsoft Windows.

Abbildung 2.2: Das Programm mit csc.exe kompilieren.

Abbildung 2.3: Läuft!

Abbildung 2.4: Kompilierfehler wegen eines fehlenden Semikolons.

Abbildung 2.5: Installationswizard der Microsoft Visual Studio Community Edition ...

Abbildung 2.6: Ein neues Projekt in Microsoft Visual Studio anlegen.

Abbildung 2.7: Die unterschiedlichen Projektvorlagen in Microsoft Visual Studio.

Abbildung 2.8: Projekteigenschaften festlegen.

Abbildung 2.9: Die Oberfläche von Microsoft Visual Studio.

Abbildung 2.10: Das Programm wird über die Symbolleiste mit dem Menüpunkt

STARTEN

Abbildung 2.11: Ein leeres Fenster zeigt, dass Ihr Programm gestartet ist.

Abbildung 2.12: Die Benutzeroberfläche bekommt Steuerelemente aus der Toolbox.

Abbildung 2.13: Das

EIGENSCHAFTEN

-Fenster für ein

Button

-Steuerelement.

Abbildung 2.14: Das Programm hat zwei

Button

-Steuerelemente.

Abbildung 2.15: Das lauffähige Programm hat eine Funktionalität: Es zeigt eine

Me

...

Abbildung 2.16: Ein NuGet-Paket über den NuGet-Paketmanager hinzufügen.

Abbildung 2.17: Der NuGet-Paketmanager: Pakete suchen und installieren.

Abbildung 2.18: Die neu referenzierte Datei und die neue »packages.config«.

Kapitel 3

Abbildung 3.1: Werttypen in C

#

.

Abbildung 3.2: Werttypen und der Stack.

Abbildung 3.3: Referenztypen in C

#

.

Abbildung 3.4: Heap und Stack mit Referenztypen.

Abbildung 3.5: Boxing und Unboxing im Speicher.

Abbildung 3.6: Eine implizite Typkonvertierung ist hier nicht möglich.

Abbildung 3.7: Fehlermeldung bei impliziter Konvertierung mit aktivierter Überlau...

Abbildung 3.8: Unerreichbarer Quellcode in Microsoft Visual Studio.

Abbildung 3.9: Objektkatalog innerhalb von Microsoft Visual Studio.

Abbildung 3.10: Fehler bei Verwendung einer Klasse, deren Namensraum nicht eingeb...

Abbildung 3.11: Aktionen und Hinweise für die Behebung von Fehlern und Warnungen.

Kapitel 4

Abbildung 4.1: Leider verloren!

Abbildung 4.2: Flussdiagramm des Ratespiels.

Abbildung 4.3: Flowchart der

for

-Schleife.

Abbildung 4.4: Flowchart der

while

-Schleife.

Abbildung 4.5: Raten Sie, bis Sie richtig liegen.

Abbildung 4.6: Flowchart der

do-while

-Schleife.

Kapitel 5

Abbildung 5.1: Strings zählen zu den Verweistypen!

Abbildung 5.2: Bei jeder Änderung eines Strings wird ein neues Objekt erzeugt und...

Abbildung 5.3: Ein

Array

mit 5

int

-Werten.

Abbildung 5.4: Fehler beim Zugriff auf ein

Array

.

Abbildung 5.5: Zugriffe auf ein

Array

.

Abbildung 5.6: Ausgabe des Beispielprogramms aus Listing 5.32.

Abbildung 5.7: Zusammenfassung der Quartalsberechnung für ein gegebenes Datum.

Kapitel 6

Abbildung 6.1: Ein PKW und seine Eigenschaften.

Abbildung 6.2: Codeausschnitt einfügen.

Abbildung 6.3: Eine durch den Codeausschnitt

propfull

eingefügte Eigenschaftendek...

Abbildung 6.4: Die von der Klasse

Fahrzeug

geerbten Members.

Abbildung 6.5: Abstrakte Methoden müssen implementiert werden, sonst gibt es eine...

Abbildung 6.6: Klassendiagramm für

PKW

,

LKW

und

Motorrad

mit

IFahrzeug

-Schnittste...

Abbildung 6.7: Microsoft Visual Studio gibt bei unvollständig implementierter Sch...

Abbildung 6.8: Schnittstelle automatisch implementieren in Microsoft Visual Studi...

Kapitel 7

Abbildung 7.1: Unbehandelte Ausnahme

DivideByZeroException

.

Abbildung 7.2: Inhalt der Eigenschaft

StackTrace

.

Abbildung 7.3: E-Mail-Client zum Versenden der E-Mail.

Kapitel 8

Abbildung 8.1: Ereignissender und Ereignisbehandler.

Abbildung 8.2: Beispielhafte Ausgabe des Programms aus Listing 8.14.

Abbildung 8.3: Das

T

wird durch den konkreten Datentyp ersetzt.

Abbildung 8.4: Eine generische Klasse ist typsicher!

Abbildung 8.5: Ausgabe der generischen Klasse.

Abbildung 8.6: Die Verwender erhalten eine Warnung, dass die Methode veraltet ist...

Abbildung 8.7: Die

String

-Klasse ist mit dem

sealed

-Schlüsselwort gegen Vererbung...

Abbildung 8.8: Die Erweiterungsmethode ist direkt (über den Namensraum) verfügbar...

Kapitel 9

Abbildung 9.1: Ausgabe des Programms aus Listing 9.9.

Kapitel 10

Abbildung 10.1: Exception beim Serialisieren.

Abbildung 10.2: Inhalt der serialisierten Binärdatei.

Abbildung 10.3: Ausgabedatei des

XmlSerializer

.

Abbildung 10.4: Ausgabedatei des

DataContractJsonSerializer

.

Abbildung 10.5: Das Json.NET-Paket mit dem Nuget-Paketmanager in das Projekt einf...

Abbildung 10.6: Ausgabedatei des Json.NET Serializers.

Kapitel 11

Abbildung 11.1: Microsoft Windows Task-Manager – Übersicht über laufende Anwendun...

Abbildung 11.2: Windows Task-Manager – Kontextmenü zu einem Prozess.

Abbildung 11.3: Windows Task-Manager – Details zu einem Prozess.

Abbildung 11.4: Parallele Ausführung von zwei Threads.

Abbildung 11.5: Ausgabe des Programms aus Listing 11.1.

Abbildung 11.6: Threads im Debugger von Microsoft Visual Studio.

Abbildung 11.7: Ausgaben des Programms aus Listing 11.10.

Kapitel 12

Abbildung 12.1: Die LINQ-Architektur im Überblick.

Abbildung 12.2: Datenmodell für LINQ-Abfragen.

Abbildung 12.3: Beispieldaten für den Shop.

Abbildung 12.4: Funktionsweise des

where

-Operators zur Anwendung eines Filters.

Abbildung 12.5: Programmausgabe: Kunden mit PLZ = 12345.

Abbildung 12.6: Funktionsweise des

orderby

-Operators.

Abbildung 12.7: Funktionsweise von

skip

- und

take

-Operator.

Abbildung 12.8: So arbeitet der

distinct

-Operator.

Abbildung 12.9: Funktionsweise von

sum

- und

max

-Aggregratfunktion.

Abbildung 12.10: Eingelesene CSV-Datei mit den Postleitzahlen als anonymer Typ.

Kapitel 13

Abbildung 13.1: Installationsassistent von EnterpriseDB.

Abbildung 13.2: Umfang der PostgreSQL-Installation.

Abbildung 13.3: Passwort für den Administrationsbenutzer postgres vergeben.

Abbildung 13.4: Die Administrationsoberfläche von

pgAdmin 4

.

Abbildung 13.5:

pgAdmin

 – neue Datenbank anlegen.

Abbildung 13.6: Northwind-Beispieldaten importieren.

Abbildung 13.7: Npgsql .NET-Datenprovider über NuGet installieren.

Abbildung 13.8: Eigenschaften einer erfolgreich hergestellten Npgsql-Verbindung.

Abbildung 13.9: Die neu angelegte Produktkategorie.

Abbildung 13.10: Die aktualisierte Produktkategorie.

Abbildung 13.11: Das Zusammenspiel von

DataSet

,

DataAdapter

und Datenbank.

Abbildung 13.12:

DataSet

-Schnellansicht im Microsoft Visual Studio Debugger.

Abbildung 13.13: Originalwert und geänderter Wert einer

DataRow

im Microsoft Visu...

Abbildung 13.14: Ausgabe der asynchron selektierten Bestellungen.

Kapitel 14

Abbildung 14.1: Die Debug-Symbolleiste von Microsoft Visual Studio.

Abbildung 14.2: Ein gesetzter Haltepunkt (Zeile 28) in Microsoft Visual Studio.

Abbildung 14.3: Deklaration einer Liste, Hinzufügen von Werten und anschließende ...

Abbildung 14.4: Zustand der Variable

myFriends

nach dem Hinzufügen eines Eintrags...

Abbildung 14.5: Das Fenster

Lokal

zur Anzeige von Variablen im aktuellen Gültigke...

Abbildung 14.6: Das Fenster

Haltepunkte

zur Anzeige von Haltepunkten innerhalb de...

Abbildung 14.7: Einstellungen für einen bedingten Haltepunkt.

Abbildung 14.8: Anzeige eines JSON-Strings im Debugger.

Abbildung 14.9: Anzeige eines JSON-Strings in der Schnellansicht.

Abbildung 14.10: Anzeigen von Rückgabewerten einer Methode.

Abbildung 14.11: Anzeige der Klasse

Friend

im Debugger.

Abbildung 14.12: Anzeige der Klasse

Friend

nach Anwendung des

DebuggerDisplay

-Att...

Abbildung 14.13: Wie Sie die

StackTrace

-Eigenschaft für die Fehlersuche verwenden...

Abbildung 14.14: Fehler und Warnungen im Quelltext-Editor von Microsoft Visual St...

Abbildung 14.15: Das Fenster

FEHLERLISTE

von Microsoft Visual Studio.

Abbildung 14.16: Vorschau der Änderungen einer Schnellaktion.

Abbildung 14.17: Schnellaktion für eine nicht verwendete Variable...

Kapitel 15

Abbildung 15.1: Grundgerüst einer Windows-Forms-Anwendung.

Abbildung 15.2: Inhalt der Datei

Form1.Designer.cs

mit dem Hinweis, die Datei nic...

Abbildung 15.3: Benutzeroberfläche des Beispielprogramms.

Abbildung 15.4: Die

TOOLBOX

im Microsoft Visual Studio Designer.

Abbildung 15.5: Das

EIGENSCHAFTEN

-Fenster in Microsoft Visual Studio.

Abbildung 15.6: Registrierung von Steuerelement-Ereignissen.

Abbildung 15.7: Ereignisse eines Buttons im

EIGENSCHAFTEN

-Fenster von Microsoft V...

Abbildung 15.8: Ereignisse eines

Button

-Steuerelements im

EDITOR

-Fenster via Inte...

Abbildung 15.9: Methode für Ereignisbehandlung mit Tastenkombination generieren.

Abbildung 15.10: Ausgabe des Beispielprogramms.

Abbildung 15.11: Ausgabe des Beispielprogramms bei fehlerhafter Eingabe.

Kapitel 16

Abbildung 16.1: Aufbau der neu erstellten WPF-Anwendung.

Abbildung 16.2: Ergebnis des Listings 16.3 .

Abbildung 16.3: Der visuelle Baum einer WPF-Anwendung in Microsoft Visual Studio.

Abbildung 16.4: Visuelle Darstellung des Grids aus Listing 16.5 .

Abbildung 16.5:

StackPanel

mit vertikaler Ausrichtung.

Abbildung 16.6:

StackPanel

mit horizontaler Ausrichtung.

Abbildung 16.7: Die Elemente werden im

WrapPanel

umbrochen (»gewrapped«), wenn de...

Abbildung 16.8: Vertikal angeordnetes

WrapPanel

.

Abbildung 16.9: Mit dem

DockPanel

können Elemente an den Seiten angedockt werden.

Abbildung 16.10: Auswirkung der

Margin

-Eigenschaft.

Abbildung 16.11: Auswirkung der

Padding

-Eigenschaft.

Abbildung 16.12: Die Eigenschaften

HorizontalAlignment

und

VerticalAlignment

in A...

Abbildung 16.13: Auswirkung der

Visibility

-Eigenschaft auf das Layout.

Abbildung 16.14: Routed Events werden im visuellen Elementbaum von oben nach unte...

Abbildung 16.15: Das Programm mit vordefinierten WPF Commands in Aktion.

Abbildung 16.16: Verwendung einer Ressource in mehreren Steuerelementen (Textbloc...

Abbildung 16.17: Dieser Button verwendet die Ressourcen aus Listing 16.17 .

Abbildung 16.18: Ein separates

ResourceDictionary

in einer separaten XAML-Datei.

Abbildung 16.19: Ausgabe aus Listing 16.20 .

Abbildung 16.20: Darstellung eines Buttons in Abhängigkeit von der

IsMouseOver

-Ei...

Abbildung 16.21: Button mit Standard-Template und mit angepasstem Template für ov...

Abbildung 16.22: Darstellung einer Liste

ohne

DataTemplate

.

Abbildung 16.23: Darstellung einer Liste

mit

DataTemplate

.

Abbildung 16.24: Einfache »Zoomfunktion« in WPF.

Abbildung 16.25: Datenfluss beim Databinding.

Abbildung 16.26: Mit dem

UpdateSourceTrigger

legen Sie fest, wann...

Kapitel 17

Abbildung 17.1: Die Benutzeroberfläche des Beispielprogramms.

Abbildung 17.2: Projektaufbau des Beispielprogramms.

Abbildung 17.3: Die einzelnen Komponenten des MVVM-Entwurfsmusters.

Kapitel 18

Abbildung 18.1: Die Benutzeroberfläche des Beispielprogramms.

Abbildung 18.2: Aufbau der Beispielanwendung.

Abbildung 18.3: Installation des

Prism Template Pack

Plug-ins.

Abbildung 18.4: Die verschiedenen Projektvorlagen für Prism.

Abbildung 18.5: Die IOC-Container-Auswahl von Prism.

Abbildung 18.6: Initiale WPF-Anwendung mit Prism.

Abbildung 18.7: Vorabversionen von NuGet-Paketen einbinden.

Abbildung 18.8: Das (noch leere) Hauptfenster der Beispielanwendung mit dem Metro...

Abbildung 18.9: Der Dependency-Injection-Container.

Abbildung 18.10: Unterteilung eines Dialogs in verschiedene Regionen.

Abbildung 18.11: Die Beispielanwendung mit den Regionen.

Abbildung 18.12: Vorlagen für

Window

- und

UserControl

-Steuerelemente aus dem

Pris

...

Abbildung 18.13: Aufbau des Prism-Moduls für die Anzeige der Postleitzahlen.

Abbildung 18.14: Aufbau des Projekts

ModularApplicationSample.Inf

...

Abbildung 18.15: Klassendiagramm für den wiederverwendbaren Service zum Verwalten...

Orientierungspunkte

Cover

Inhaltsverzeichnis

Fangen Sie an zu lesen

Seitenliste

1

2

3

4

5

6

9

10

11

23

24

25

26

27

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

451

452

453

454

455

456

457

458

459

460

461

462

463

464

465

466

467

468

469

470

471

472

473

474

475

476

477

478

479

480

481

482

483

484

485

486

487

488

489

490

491

492

493

494

495

497

498

499

500

501

502

503

504

505

506

507

508

509

510

511

512

513

514

515

517

518

519

520

521

522

523

524

525

526

527

528

529

530

531

532

533

534

535

536

537

538

539

540

541

542

543

544

545

546

547

548

549

550

551

552

553

554

555

556

557

558

559

560

561

563

564

565

566

567

568

569

570

571

Einleitung

Ich habe schon in verschiedenen Programmiersprachen Anwendungen geschrieben, aber die Programmiersprache C# ist mir persönlich immer noch am liebsten. Alles ist dort sehr gut strukturiert und es gibt eine sehr gute Dokumentation. Die zur Verfügung stehenden Entwicklungswerkzeuge sind sehr ausgereift und es macht einfach Spaß, damit zu arbeiten.

Über dieses Buch

Ich erinnere mich noch recht gut an meine ersten Programmierversuche, diese standen ganz unter dem Motto: Learning by doing! Denn schon Aristoteles sagte:

Was man lernen muss, um es zu tun, lernt man, indem man es tut.

Am besten lernen Sie das Programmieren durch Ausprobieren, daher sollten Sie nach Belieben mit C# experimentieren. Sie können nichts kaputt machen!

Beim Erlernen einer Programmiersprache bringt diese Vorgehensweise jedoch einen gravierenden Nachteil mit sich: Sie legen die Anforderungen fest, die Ihr Programm erledigen soll, und legen los. Wenn Sie aber nicht genau wissen, wie gewisse Themen, beispielsweise das Einlesen von Dateien oder der Zugriff auf eine Datenbank, korrekt umgesetzt werden, wird es schwer, ein gutes Programm zu schreiben. Gerade die Fehlersuche kann bei fehlenden Grundkenntnissen sehr schwierig werden. Dies gilt im übrigen für jede Programmiersprache – also nicht nur für C#. Das lässt sich auch auf andere Lebensbereiche übertragen. Mal ein Beispiel (das der eine oder andere vielleicht schon kennt): Angenommen, Sie haben sich einen neuen Kleiderschrank gekauft, den Sie selbst aufbauen möchten. Im Grunde wissen Sie, wie das Endresultat aussehen soll, und legen einfach los, ohne vorher die Aufbauanleitung zu lesen. Sie werden den Kleiderschrank sehr wahrscheinlich aufgebaut bekommen, aber am Ende bleiben eventuell ein paar Teile übrig und diese Teile habe möglicherweise entscheidende Auswirkungen auf die Stabilität oder Funktion des Schranks. Bei der Programmierung ist es ganz ähnlich: Es gibt einige Regeln, die es zu beachten gilt, damit die Funktionalität und Stabilität eines Programms gewährleistet ist, gerade bei größeren Projekten sollte man darauf besonders achten.

Sie werden sich jetzt vielleicht fragen: Wie soll ich dieses Buch durchlesen? Die Antwort auf diese Frage richtet sich ein wenig nach Ihrem Kenntnisstand: sowohl bezüglich der Programmierung im Allgemeinen als auch bezüglich der Programmiersprache C# im Besonderen. Für Einsteiger ist es sicherlich am besten, das Buch von vorne bis hinten durchzuarbeiten, insbesondere die ersten beiden Teile. Fortgeschrittene Leser können je nach Kenntnisstand auch einzelne Kapitel überspringen.

Dieses Buch teilt die C#-Programmierung in verschiedene Bereiche. In einigen Kapiteln lernen Sie grundlegende Konzepte der Programmierung, in anderen Kapiteln geht es um die praktische Anwendung von speziellen C#-Features. Im Grunde können Sie an einer beliebigen Stelle einsteigen. Ich habe versucht, die Kapitel und Beispiele so zu gestalten, dass sie nicht aufeinander aufbauen. Wichtige Informationen aus einzelnen Kapiteln werden an geeigneter Stelle wieder aufgegriffen und als Hinweis eingebunden, damit Sie wissen, worum es geht.

Eine weitere kurze Anmerkung zum Buch, bevor es gleich losgeht: Es lässt sich leider nicht vermeiden, dass bei der Erklärung bestimmter Themen gewissen Inhalten vorgegriffen wird, da gewisse Konzepte der Programmiersprache C# andere voraussetzen. An diesen Stellen gebe ich Ihnen aber einen entsprechenden Hinweis auf das Kapitel oder den Abschnitt, in denen das vorgegriffene Thema besprochen wird. In einigen Kapiteln gebe ich Ihnen auch Hinweise auf bereits behandelte Themen, die Sie dann nochmal nachlesen können.

Grundsätzlich können Sie wie folgt vorgehen:

Wenn Sie etwas schon kennen, brauchen Sie es nicht erneut zu lesen.

Wenn Sie ein bestimmtes Themengebiet besonders interessiert, scheuen Sie sich nicht, an die entsprechende Stelle zu springen. Innerhalb der einzelnen Themengebiete gibt es an geeigneter Stelle Wiederholungen von wichtigen, bereits behandelten Themen. Sie können bei Bedarf jederzeit wieder einen Blick in ein früheres Kapitel werfen.

Wenn Sie sich mit der Programmierung beschäftigten – egal um welche Programmiersprache es sich handelt –, müssen einigen Voraussetzungen erfüllt sein, daher treffe ich hier ein paar einfache Annahmen:

Der in diesem Buch gezeigte Code kann auf fast jedem beliebigen Rechner ausgeführt werden. Ideale Voraussetzung ist ein recht aktueller Computer mit Microsoft Windows als Betriebssystem.

Sie sind mit der grundlegenden Bedienung eines Computers vertraut. Sie müssen kein Microsoft-Windows-Profi sein, um mit der Programmierung in C

#

zu beginnen. Sie sollten aber in der Lage sein, ein Programm zu starten, zu installieren, Dateien zu suchen und in einem bestimmten Verzeichnis abzulegen.

Für manche Beispiele müssen Sie zusätzliche Software installieren, beispielsweise eine Datenbank, und hierfür leite ich Sie durch die einzelnen Schritte. Es kann aber vorkommen, dass manche Computer so konfiguriert sind, dass diese Anleitungen nicht ganz so funktionieren wie beschrieben. Hier sollten Sie sich nicht entmutigen lassen und vielleicht im Internet nach einer Lösung suchen. Ich werde in den jeweiligen Kapiteln entsprechende Hinweise geben.

Wie dieses Buch aufgebaut ist

Dieses Buch besteht auf fünf Teilen, die wiederum in einzelne Kapitel aufgeteilt sind, und zwar:

Teil I: Los geht's

Dieser Teil vermittelt die Grundlagen der Programmierung und eine Einführung in die Sprache C#. Hier lernen Sie, wie die Entwicklungsumgebung eingerichtet wird und wie Sie Ihre ersten C#-Programme erstellen. Zusätzlich vermittelt dieser erste Abschnitt die Grundlagen der objektorientierten Programmierung.

Teil II: Weitere Sprachfeatures von C#

Nach den Grundlagen werden in diesem Teil erweiterte Sprachfeatures von C# vorgestellt. Wenn Sie vielleicht schon Erfahrung in einer anderen Programmiersprache besitzen, können Sie einige Abschnitte überspringen oder den Stoff einfach nur querlesen. Gehen Sie dabei aber nicht zu schnell vor, es werden auch einige Besonderheiten von C# erläutert, die es in anderen Programmiersprachen nicht gibt.

Teil III: Eine eigene C#-Anwendung schreiben

In Teil III geht es vor allem darum, das Gelernte in einer eigenen Anwendung zu festigen, dabei kommen die Programmoberflächen-Technologien Windows Forms und die Windows Presentation Foundation (WPF) zum Einsatz. Da der Alltag eines Softwareentwicklers nicht nur aus der Programmierung neuer Anwendungen besteht, sondern zum großen Teil auch aus Fehleranalyse und Fehlerbeseitigung, gibt es ein eigenes Kapitel zur Fehlersuche. In diesem Teil werden Sie einige nützliche Tipps finden, die den Programmieralltag einfacher machen können.

Teil IV: Fortgeschrittene Techniken in C#

Wenn Sie in diesem Teil angekommen sind, haben Sie C# schon ausprobiert und vielleicht sogar Lust auf mehr bekommen. Die Kapitel dieses Abschnitts beschäftigen sich vor allem mit Details der modularen Anwendungsentwicklung und wie eine solche Anwendung aufgebaut sein kann. Wenn sie die früheren Teile des Buchs gelesen und ein paar eigene Programme geschrieben haben, können Sie in diesem Teil tiefer in die Materie einsteigen. Hier geht es mir vor allem darum, Ihnen Anregungen und Ideen für eigene Programme zu geben.

Teil V: Der Top-Ten-Teil

Der Top-Ten-Teil gibt nochmal ein paar Tipps (raten Sie mal, wie viele), welche Konstrukte von C# Sie unbedingt lernen und auch einsetzen sollten. Zusätzlich finden Sie hier noch einen kleinen Überblick über Open-Source-Projekte, welche ebenfalls in C# programmiert sind. Sich diese Projekte anzuschauen, lohnt sich gleich zweifach: Zum einen können Sie hier weitere Details über die Programmiersprache C# lernen, zum anderen lassen sich die dort vorgestellten Projekte wunderbar in Ihren eigenen Programmen einsetzen. Das eine oder andere Projekt wurde bereits im Buch vorgestellt und benutzt, daher lohnt sich ein Blick in diesen Abschnitt auf jeden Fall.

Übrigens: Einige Kapitel haben einen Abschnitt mit Praxisbeispielen. In diesen Abschnitten finden Sie fertige Lösungen zu Aufgabenstellungen, die in der Praxis häufig auftreten. Idealerweise können Sie diese Lösungen direkt einsetzen, in einigen Fällen wird aber etwas Nacharbeit notwendig sein, dann nehmen Sie es einfach als Denkanstoß. Natürlich lassen sich viele Probleme auf unterschiedliche Arten lösen, daher gibt es fast nie nur die eine Lösung. Sehen Sie die Praxisbeispiele auch als eine Art Inspiration und entwickeln Sie Ihre eigenen Lösungen.

Symbole, die in diesem Buch verwendet werden

Um einen bestimmten Sachverhalt zu vertiefen oder Ihnen eine weiterführende Information zu geben, nutzt dieses Buch die folgenden, für-Dummies-typischen Symbole:

Hier wird ein Hinweis gegeben, der Ihnen helfen kann, das jeweilige Thema besser zu verstehen.

Fehler werden bei der Softwareentwicklung immer passieren und gehören gewissermaßen zum Programmieralltag. Es gibt allerdings bestimmte Themen oder Situationen, die ganz besonders zu Fehlern verleiten. Wenn ich glaube, dass es sich um ein solches Thema oder so eine Situation handelt, weise ich Sie mit diesem »Warnung«-Symbol darauf hin.

Es wird immer wieder Themen geben, die aufeinander aufbauen. Mit dem Symbol »Erinnerung« weise ich darauf hin, dass das aktuelle Thema schon einmal behandelt wurde und wo Sie es gegebenenfalls nochmal nachlesen können.

Mit dem »Techniker« erhalten Sie Hintergrundinformationen zum gerade behandelten Thema. Sie müssen diese Abschnitte nicht unbedingt lesen, sie können aber helfen, ein Thema besser zu verstehen.

Wie in vielen anderen Bereichen auch gibt es in der Softwareentwicklung Fachbegriffe, die oft für viele Programmiersprachen von Bedeutung sind. Solche Begriffe werden bei diesem Symbol erklärt.

Die Weltkugel soll Ihre Aufmerksamkeit auf nützliche Informationen lenken, die Sie im Internet finden können.

Dieses Symbol dient als »Wegweiser« innerhalb des Buchs. So sollten Sie auf einen Blick erkennen können, wo Sie weitere Informationen zu einem bestimmten Thema finden können.

Wie es weiter geht

Die Einleitung ist geschafft und Sie sind soweit, Näheres über das Entwickeln von Anwendungen in C# zu erfahren.

Um Ihnen zeitraubende Tipparbeit zu ersparen, können Sie die Quellcodes zu den Beispielen unter http://www.wiley-vch.de/ISBN9783527715190 finden.

Teil I

Los geht's

IN DIESEM TEIL …

Klären wir die Frage: Warum programmieren wir eigentlich?Werden Sie lernen, was die .NET-Plattform ist und welche Konzepte sich dahinter verbergenFinden Sie heraus, was objektorientierte Programmierung bedeutet …… und welche Werkzeuge benötigt werden, um C#-Programme zu entwickelnSehen Sie Ihr erstes vollständiges C#-Programm

Kapitel 1

Grundlagen und Einführung

IN DIESEM KAPITEL

Grundlagen der Programmierung.NET als SoftwareentwicklungsplattformEinordnung der Programmiersprache C#

Sie haben sich dieses Buch zum Erlernen der Programmiersprache C# gekauft. In diesem Buch werden keinerlei Programmierkenntnisse vorausgesetzt, daher möchte ich Ihnen in diesem ersten Kapitel grundlegende Konzepte der Programmierung nahebringen. Einige dieser Begriffe und Konzepte sind für das spätere Verständnis der Programmiersprache C# sicherlich hilfreich. Beim Erlernen des Programmierens – ganz gleich in welcher Sprache – ist es wichtig, ein paar grundlegende Begriffe und Zusammenhänge verstanden zu haben, um tiefer in die Materie einzusteigen. Sollten Sie schon Programmiererfahrung haben, können Sie dieses Einstiegskapitel auch überspringen. Dieses Einstiegskapitel ist aber bewusst kurz gehalten, damit wir schnell mit dem eigentlichen Thema des Buches starten können, nämlich der Programmiersprache C#.

Grundlagen der Programmierung

Ganz ohne Theorie geht nichts! In diesem leider etwas »trockenen« Abschnitt lernen Sie ein paar Grundlagen zur Programmierung. Bevor Sie mit den ersten Programmzeilen beginnen, sollten Sie ein gewisses Grundverständnis dafür haben, was Programmierung überhaupt ist. Dabei möchte ich auf die folgenden Fragestellungen eingehen:

Warum programmieren wir eigentlich?

Welche Rolle übernehmen die Programmiersprachen hierbei?

Was ist .NET?

Wo lässt sich die Programmiersprache C

#

einordnen?

Warum programmieren wir eigentlich?

In erster Linie geht es bei der Programmierung darum, einen Computer dazu zu bringen, bestimmte Aufgaben zu übernehmen. Denken Sie dabei einfach mal an Ihren Alltag und überlegen Sie, wo Sie überall einen Computer oder eine Software einsetzen, um eine bestimmte Aufgabe zu erledigen. Das kann beispielsweise ein E-Mail-Programm, eine Bildbearbeitungssoftware oder die Smartphone-App sein, mit der Sie Textnachrichten versenden. All diese Programme hat irgendjemand programmiert, um dem Benutzer bei einer bestimmten Aufgabenstellung zu helfen.

Sie als angehender Entwickler haben bei der Programmierung nun die Aufgabe, dem Computer Anweisungen (auch Befehle genannt) zu geben. Sie sagen dem Computer also, was er genau tun soll, beispielsweise eine E-Mail versenden oder eine Webseite aufrufen. Diese Befehle werden dann vom Computer Schritt für Schritt ausgeführt. Das können Sie mit einem Kochrezept vergleichen. In einem Rezept wird vorgegeben, welche Schritte in welcher Reihenfolge ausgeführt werden müssen, damit am Ende beispielsweise ein Kuchen daraus wird. Im Grunde geben Sie dem Computer die Schritte vor, die er dann ausführen soll, um eine bestimmte Aufgabe zu erfüllen.

Die Arbeitsschritte zur Lösung einer bestimmten Problemstellung (also das Rezept) werden in der Informatik als Algorithmus bezeichnet. Bei den Programmen (auch Software oder Anwendung genannt), die Sie zukünftig programmieren werden, handelt es sich daher um eine Folge von Algorithmen. Die Algorithmen geben die Anweisungen vor, die vom Computer ausgeführt werden sollen.

Die zur Lösung einer Problemstellung definierten Arbeitsschritte nennt man in der Softwareentwicklung Algorithmus. Vergleichen lässt sich das in etwa mit Kochrezepten, Betriebsanleitungen oder Schritt-Für-Schritt-Anleitungen. Ein Algorithmus ist, so gesehen, eine Anleitung für den Computer, wie er ein bestimmtes Problem oder eine vorgegebene Aufgabenstellung zu lösen hat.

Ein Programm setzt sich aus vielen verschiedenen Algorithmen zusammen, um eine bestimmte Aufgabe zu lösen.

Als Programmieranfänger tut man sich oft sehr schwer, die Arbeitsschritte eines Algorithmus zu definieren. Beim Kochen eines Gerichts wird sehr häufig variiert oder improvisiert. Ein Computer hingegen ist sehr penibel, was die Ausführung der ihm vorgegebenen Schritte angeht. Diese werden genauso ausgeführt, wie sie im Algorithmus vorgegeben wurden.

Gerade am Anfang stellen Sie sich vielleicht die Frage: Wie lernt man Programmieren? Nach all den Jahren kann ich Ihnen sagen: Man lernt es nur, wenn man selbst programmiert. Getreu dem Motto: Learning by doing! Sie sollten immer wieder selbst Programme erstellen oder bereits bestehende Programme nochmals überdenken und gegebenenfalls optimieren. Sie sollten sich auch nicht scheuen, mal den einen oder anderen Blick in ein Open-Source-Projekt zu werfen, auch hier kann man sehr viel lernen (dazu später mehr). Gerade am Anfang wird nicht alles direkt auf Anhieb funktionieren, aber das geht jedem Entwickler so. Das gehört zum Lernprozess.

Ein Open-Source-Projekt ist ein Programm, dessen Quelltext veröffentlicht wurde und jedem frei zugänglich ist. Es kann von jedem eingesehen und unter bestimmten Bedingungen auch verändert werden.

Im Verlauf des Buchs werde ich Ihnen einige interessante Open-Source-Projekte vorstellen und Ihnen auch zeigen, wie Sie solche Projekte in Ihren eigenen Programmen einsetzen können.

Programmiersprachen

Sie haben bestimmt schon einmal den folgenden Satz gehört: Computer arbeiten mit Nullen und Einsen. Hintergrund dafür ist die technische Ebene eines Computers in Form des Prozessors, der eben nur zwei Zustände versteht: null für »Strom aus« und eins für »Strom an«. Sie kennen eine solche Verarbeitung etwa aus dem Morsealphabet. Mit einem solchen Morse-Code ist es möglich, Buchstaben und Zahlen zu übermitteln, dabei wird ein Signal unterschiedlich lange ein- und dann wieder ausgeschaltet. Der Morsecode besteht aus drei Signalen oder Symbolen: kurzes Signal, langes Signal und Pause. Ein Computer hingegen kennt, wie bereits erwähnt, nur zwei Zustände. Diesen Code, in dem Informationen durch zwei unterschiedliche Zustände dargestellt werden, nennt man auch Binärcode. Binärcode ist von einem Computer direkt ausführbar und sorgt dafür, dass er auch die Dinge tut, die Sie ihm in Form eines Algorithmus vorgeben.

Als Hardware bezeichnet man alles rund um einen Computer, das man anfassen kann, also seine physischen Komponenten wie beispielsweise die Festplatte oder der Prozessor eines Computers.

Sie können sich jetzt sicher vorstellen, dass es für einen Entwickler außerordentlich kompliziert wäre, die Anweisungen an den Computer (also den Algorithmus) in Nullen und Einsen zu formulieren. Stellen Sie sich einmal vor, Sie hätten den folgenden Programmcode

Das kann ein normaler Menschen weder lesen noch lässt sich erkennen, was diese Folge von Nullen und Einsen bewirken soll. Hier kommen dann die Programmiersprachen ins Spiel. Programmiersprachen helfen, die Interaktion mit dem Computer zu vereinfachen. Sie »verschonen« einen Entwickler also damit, beim Programmieren mit Nullen und Einsen hantieren zu müssen.

Die Anweisungen, die wir dem Computer in Form einer Programmiersprache geben, werden als Text formuliert und in ganz gewöhnlichen Textdateien gespeichert. Diese Dateien werden als Quelldateien (engl.: source files) bezeichnet und der Inhalt einer solchen Datei heißt Quelltext oder Quellcode (engl.: source code). Die Gesamtheit des Quelltexts wird unter dem Begriff Programm zusammengefasst (wobei ein Programm aus einer oder mehreren Quellcode-Dateien bestehen kann).

Der Quellcode wird nach genau festgelegten Regeln formuliert. Diese Regeln können je nach gewählter Programmiersprache variieren und sind durch die Grammatik der gewählten Programmiersprache festgelegt. Anders als natürliche Sprachen sind Programmiersprachen wenig flexibel. Die festgelegten Grammatikregeln müssen unbedingt eingehalten werden. Jedes Zeichen, wie beispielsweise ein Punkt oder Komma, hat seine Bedeutung. Selbst ein kleiner Fehler führt dazu, dass das komplette Programm nicht ausgeführt werden kann. In C# gibt es beispielsweise eine Regel, dass jede Anweisung mit einem Semikolon beendet werden muss. Das hört sich jetzt schlimmer an, als es in Wirklichkeit ist. Moderne Entwicklungsumgebungen erkennen Syntaxfehler schon während der Entwicklung und geben einem Entwickler entsprechende Hinweise, dass ein Fehler vorliegt. Manche Entwicklungsumgebungen sind sogar in der Lage, solche Fehler automatisch zu korrigieren.

In Kapitel 2Entwicklungswerkzeuge und Tools werde ich Ihnen eine Entwicklungsumgebung vorstellen, die viele der beschriebenen Funktionen bereitstellt.

Eine Quellcode-Datei lässt sich leider nicht ohne Weiteres auf dem Rechner ausführen. Damit der Computer den Quelltext ausführen kann, den Sie geschrieben haben, muss der Quelltext in ein Format übersetzt werden, das der Computer auch versteht (also Nullen und Einsen). Dieses Format wird auch als Maschinencode oder Maschinenbefehle bezeichnet.

Alles was ein Entwickler in einer bestimmten Programmiersprache formuliert, wird als Quellcode bezeichnet. Bei Maschinencode handelt es sich um Code, der vom Prozessor eines Computers gelesen und ausgeführt werden kann.

Sie müssen sich natürlich nicht selbst um die Übersetzung von Quellcode in Maschinencode kümmern, denn dann bräuchten wir ja keine Programmiersprache. Dazu gibt es im Wesentlichen zwei verschiedene Wege:

zum einen gibt es

Compiler

und

zum anderen sogenannte

Interpreter

Es gibt eine Vielzahl von Programmiersprachen. Manche Programmiersprachen verwenden einen Compiler und werden daher auch als kompilierte Programmiersprachen bezeichnet. Daneben gibt es sogenannte interpretierte Programmiersprachen, die einen Interpreter benötigen. Es gibt aber noch eine dritte Variante: Programmiersprachen, die beides benötigen, sogenannte Zwischensprachen. Bevor wir uns anschauen, was ein Compiler und was ein Interpreter ist und worin sich die genannten Sprachtypen unterscheiden, kann ich einen Punkt schon einmal vorwegnehmen (Achtung: Spoiler!): Bei der Programmiersprache C# handelt es sich um eine Zwischensprache, die sowohl Compiler als auch Interpreter benötigt.

Kompilierte Programmiersprachen

Bei einer kompilierten Programmiersprache wird der Quellcode mithilfe eines sogenannten Compilers in Maschinencode kompiliert. Bei diesem Vorgang spricht man auch oft von »übersetzen«. Wenn Sie das Betriebssystem Windows von Microsoft einsetzen und dort ein Programm starten (beispielsweise ein Programm für die Bildbearbeitung) führen Sie eine sogenannte *.exe-Datei aus. Eine *.exe-Datei enthält den ausführbaren Maschinencode und ist das Ergebnis eines Kompiliervorgangs. Die Programme, die durch einen Compiler erzeugt wurden, können dann direkt ohne weitere Hilfskomponenten oder sonstige Laufzeitumgebungen auf dem Betriebssystem, für das sie kompiliert wurden, ausgeführt werden. In Abbildung 1.1 ist der Vorgang des Kompilierens dargestellt.

Abbildung 1.1: Ein Compiler übersetzt Quelltext in ausführbaren Maschinencode (*.exe-Datei).

Ein Compiler ist ein Computerprogramm, das Quellcode einer bestimmten Programmiersprache in ausführbaren Maschinencode übersetzt, der dann von einem Computer mit einem bestimmten Betriebssystem gelesen und ausgeführt werden kann.

Als Beispiele für kompilierte Programmiersprachen können C oder auch C++ genannt werden. Damit ein in C++ geschriebenes Programm ausgeführt werden kann, muss es vorher über einen entsprechenden C++-Compiler in ausführbaren Maschinencode übersetzt werden. Jetzt ist es leider so, dass für die unterschiedlichen Betriebssysteme jeweils ein eigener C++-Compiler benötigt wird. Das bedeutet, dass für jedes Betriebssystem auch eine eigene Version des Programms kompiliert werden muss. Um das Programm also unter Windows laufen zu lassen, muss es zuvor unter Windows mit einem entsprechenden Compiler kompiliert werden. Dies gilt analog für Linux, macOS und jedes andere Betriebssystem. Das Kompilieren für die unterschiedlichen Betriebssysteme ist mit recht viel Aufwand verbunden und auch gleichzeitig einer der größten Nachteile von kompilierten Programmiersprachen.

Programme, die für ein bestimmtes Betriebssystem kompiliert wurden, nennt man auch native Programme.

Trotz des ganzen Aufwands haben kompilierte Programme einen entscheidenden Vorteil: Der erzeugte Maschinencode kann direkt, ohne weitere Hilfsprogramme und ohne Laufzeitumgebung, auf dem jeweiligen Betriebssystem ausgeführt werden. Auf dem Zielbetriebssystem muss keine weitere Software installiert werden, um das kompilierte Programm ausführen zu können. Das ist ein großer Unterschied zu interpretierten Programmiersprachen, die ich Ihnen jetzt kurz vorstelle.

Interpretierte Programmiersprachen

Bei interpretierten Programmiersprachen ist es nicht notwendig, den Quellcode für ein bestimmtes Betriebssystem zu kompilieren. Der Quellcode wird hier nicht mit einem Compiler übersetzt, sondern durch einen Interpreter (zur Laufzeit des Programms) eingelesen, analysiert und ausgeführt. Zwingende Voraussetzung ist hier, dass der Interpreter auf dem Zielrechner installiert sein muss, auf dem das Programm ausgeführt werden soll. Der Interpreter muss natürlich für das jeweilige Betriebssystem zur Verfügung stehen. Im Gegensatz zum Compiler, der nur auf dem Computer installiert sein muss, auf dem der Quellcode kompiliert wird (im Normfallfall ist das der Entwicklungsrechner). Abbildung 1.2 verdeutlicht diesen Vorgang.

Abbildung 1.2: Ein Interpreter wertet den Quelltext direkt aus und wandelt ihn in Maschinencode um.

Ein Interpreter ist ein Computerprogramm, das Quellcode im Gegensatz zu einem Compiler nicht in eine auf dem System direkt ausführbare Datei übersetzt, sondern den Quellcode einliest, analysiert und direkt zeilenweise ausführt. Die Übersetzung des Quellcodes erfolgt also erst zur Laufzeit des Programms. Der Interpreter ist dabei Bestandteil des Betriebssystems oder muss dort nachträglich installiert werden.

Interpretierte Programmiersprachen erfreuen sich großer Beliebtheit, da kein Compiler notwendig ist und der zusätzliche Kompiliervorgang entfällt. Einer der bekanntesten Vertreter von interpretierten Programmiersprachen ist JavaScript. Nachteil interpretierter Sprachen ist allerdings, dass diese Programme tendenziell weniger performant sind als kompilierte Programme, da die Umwandlung des Quellcodes zur Laufzeit des Programms stattfindet (diese Umwandlung zur Laufzeit entfällt bei kompilierten Programmen).

Unter dem Begriff Performance versteht man das Leistungsverhalten von Hard- und Software. In der Softwareentwicklung verwendet man den Begriff Performance oft im Sinne von »wie schnell« eine bestimmte Aufgabe ausgeführt werden kann.

Ein weiterer Nachteil interpretierter Sprachen ist, dass Syntaxfehler erst zur Laufzeit erkannt werden und somit beim Programmieren schnell übersehen werden können. Bei kompilierten Sprachen hingegen werden Syntaxfehler direkt beim Kompilieren erkannt, die erkannten Fehler müssen dann zwingend für einen erfolgreichen Kompilierungsvorgang behoben werden.

Zwischensprachen

Es gibt einige Programmiersprachen, die sowohl Compiler als auch Intertreter benötigen. Da man diese Programmiersprachen nicht eindeutig einer der beiden Kategorien zuordnen kann, werden diese Sprachen auch als Zwischensprachen bezeichnet. Wie ich bereits vorweggenommen habe, ist C# (wie auch Java) eine solche Zwischensprache. In Abbildung 1.3 sehen Sie schematisch, wie eine solche Zwischensprache ausgeführt wird.

Abbildung 1.3: Es gibt auch Programmiersprachen, die eine Kombination aus Compiler und Interpreter verwenden.

In C# ist es so, dass der Quelltext durch einen Compiler in sogenannten CIL-Code (Common Intermediate Language) kompiliert wird. Der CIL-Code ist eine Art Zwischencode, der seinerseits einen Interpreter benötigt, um ausgeführt werden zu können. Dazu erfahren Sie gleich mehr! Der Vorteil: C#-Anwendungen müssen nicht (wie bei rein kompilierten Sprachen) auf dem gleichen Betriebssystem kompiliert werden, auf dem sie später ausgeführt werden, da der CIL-Code grundsätzlich unabhängig vom Betriebssystem und der verwendeten Programmiersprache ist. Das Einzige, was auf dem jeweiligen Zielbetriebssystem vorhanden sein muss, ist ein Interpreter für diesen CIL-Code, mit anderen Worten: eine Laufzeitumgebung. Für C# heißt diese Laufzeitumgebung .NET-Framework, sie ist Bestandteil der .NET-Plattform. Im nächsten Kapitel möchte ich Sie mit der .NET-Philosophie und den damit verbundenen Konzepten, Begriffen und Features vertraut machen.

.NET-Plattformarchitektur

Als Autor bin ich jetzt etwas in der Zwickmühle: Eigentlich finde ich Bücher langweilig, die sich zu Beginn lang und breit mit einer Technologie befassen und in denen ein Fachbegriff nach dem anderen eingeführt wird. Beim Schreiben musste ich jedoch feststellen, dass das leider unumgänglich ist. Um die Programmiersprache C# zu verstehen, müssen wir uns zunächst die Plattform .NET anschauen, damit Sie überhaupt mit C# programmieren können.

Daher lernen Sie in diesem Abschnitt einige elementare Grundlagen von .NET. Zwangsläufig werden hier ein paar Begriffe fallen, die Ihnen möglicherweise zu diesem Zeitpunkt nicht sehr viel sagen. Ich werde die theoretischen Grundlagen aber auf ein Minimum reduzieren und mich auf das beschränken, was für einen Einstieg in die Programmiersprache C# absolut notwendig ist. Es werden vermutlich einige Begriffe fallen, die Sie nicht sofort einordnen können. Das wird sich aber im weiteren Verlauf des Buches alles aufklären.

Ganz allgemein gesprochen ist .NET (gesprochen Dotnet) eine Plattform der Firma Microsoft für die Entwicklung von Software, die im Jahre 2002 offiziell vorgestellt wurde. Mit der Einführung der .NET-Technologie wurde auch eine Vielzahl neuer Begriffe eingeführt und es kommen ständig neue hinzu. Ich möchte Ihnen hier lediglich einen groben Überblick über die wichtigsten Begriffe und Konzepte geben, denn alles andere würde den Rahmen dieses Buchs sprengen. Zum Lernen der Programmiersprache C# müssen Sie auch nicht alle Begriffe und Konzepte kennen, es geht hier lediglich um ein Grundverständnis der .NET-Plattform.

.NET wurde als moderne und betriebssystemunabhängige Softwareentwicklungsplattform geschaffen, die es ermöglicht, Anwendungen für unterschiedliche Plattformen zu entwickeln. Dabei eignet sich die .NET-Plattform zum Erstellen von Applikationen für das Web, für Microsoft Windows, für Smartphones und für andere Betriebssysteme.

Bedingt durch die lange Historie von .NET gibt es allerdings einen gravierenden Nachteil: Im Laufe der Zeit ist eine schier unendliche Menge an Klassen entstanden, die fast unüberschaubar geworden ist. Microsoft hat dieses Problem erkannt und treibt die Umstrukturierung der .NET-Plattform voran. Darauf möchte ich aber nicht weiter eingehen. Wichtig für Sie: Gerade am Anfang wird es schwer sein, ich zu orientieren. Geben Sie nicht zu schnell auf, es lohnt sich. Es gibt eine sehr gute Dokumentation und wenn der Einstieg einmal geschafft ist, kommt der Rest von ganz allein. Selbst die erfahrensten Entwickler kennen wahrscheinlich nicht alle Klassen, die die .NET-Plattform zu bieten hat.

Doch was ist jetzt so toll an .NET und was bringt es dem Entwickler?

Objektorientierung

 – In .NET arbeiten Sie durchweg mit Klassen und Objekten. Was das genau bedeutet, lernen Sie in einem späteren Kapitel. Sie haben jedenfalls eine moderne Grundlage für die Entwicklung Ihrer Anwendungen.

Plattformunabhängigkeit

 – .NET-Anwendungen sind grundsätzlich plattformunabhängig. Für Sie hat das den folgenden Vorteil: Sie programmieren eine Anwendung und diese lässt sich dann auf Microsoft Windows, Linux oder macOS ausführen.

Sprachunabhängigkeit

 – .NET ist grundsätzlich sprachunabhängig und unterstützt mehrere Programmiersprachen. Dies bedeutet, dass Sie als Entwickler in einer von vielen Sprachen für die .NET-Plattform entwickeln können.

Speicherverwaltung

 – In einigen Programmiersprachen müssen Sie sich als Entwickler explizit um die Freigabe von nicht mehr benötigtem Speicher kümmern. Das ist im .NET-Umfeld nicht mehr so, dort gibt es den sogenannten

Gargabe Collector

. Der Garbage Collector erkennt automatisch nicht mehr benötigte Objekte und entfernt diese aus dem Speicher.

In Abbildung 1.4 ist das alles noch einmal zusammengefasst.

Abbildung 1.4: Übersicht .NET-Plattform (High-Level).

Sollten Sie sich weiter in das Thema .NET-Plattform einarbeiten wollen, legen ich Ihnen das Portal von Microsoft ans Herz: https://www.microsoft.com/net/

Dort erhalten Sie weiterführende Informationen zu verschiedenen .NET-Themen und den unterschiedlichen Möglichkeiten, die die .NET-Plattform bietet.

In den nächsten Abschnitten lernen Sie die einzelnen Bestandteile noch etwas näher kennen und insbesondere, wie eine .NET-Sprache grundsätzlich funktioniert.

Wie funktioniert eine .NET-Sprache?

Die .NET-Plattform unterstützt unterschiedliche Programmiersprachen, beispielsweise C#