C# Einführung
- Grundlagen der Programmierung Do, Hoang Viet (do@mi.fu-berlin.de)
Draphony Games (http://www.draphony.de)
Grundlagen
01.12.2013
2
Grundbegriffe in der Entwicklung
• Quellcode
Entwickler schreiben das Programm in einer Programmiersprache. Dieser Text wird
Quellcode genannt.
Im Gegensatz zur natürlichen Sprache erfüllen Programmiersprache diverse
Anforderungen, die eine weitere maschinelle Verarbeitung erst ermöglich, u.a.
Eindeutigkeit
•
Gegenbeispiel aus Wikipedia: Jeder Mann liebt eine Frau. (Wikipedia Artikel)
• Compiler
Der Quellcode muss mit Hilfe eines Programms in einer maschinenlesbare Sprache
übersetzt werden.
01.12.2013
3
Demo: „HelloWorld“
01.12.2013
4
Häufig gemachte Fehler
• C# unterscheidet zwischen Groß- und Kleinschreibung (engl. case-sensible)
Console.WriteLine ist nicht das selbe wie console.writeline
• Absätze wie Leerzeichen, Tabulatoren sind optional
In den meisten Fällen, lässt sich der Quellcode auch in einer einzigen Zeile schreiben.
(Daran haben später alle Spaß!)
• Eine Anweisung wird mit einem Semikolon beendet
Console.WriteLine(“Hello World“);
int a = 10;
• Copy & Paste von Folien
In Powerpoint werden die Anführungsstriche den Länderspezifischen Normen
angepasst. Derartiges in der Programmierung nicht!
01.12.2013
5
Grundbegriffe in .net
• C# Compiler
übersetzt Quellcode in CIL – Code
• Common Intermediate Language (CIL, früher MSIL)
Zwischensprache, indem der Quellcode übersetzt wird
„Assembler“ von .net
• JIT / Jitter (Just-In-Time compilation)
Übersetzt den CIL–Code (zur Laufzeit) in maschinennahem Code
• Common Language Runtime (CLR)
Ausführungsumgebung von .net – Anwendungen
01.12.2013
6
Grundbegriffe in .net
• Garbage Collector (GC)
Verwaltet den Programmspeicher
Verhindert „Speicherlecks“
• Framework Class Library (FCL)
Von .net zur Verfügung gestellte Funktionalitäten
Auflistung der Klassen (MSDN-Link)
• Common Language Infrastructure (CLI)
Common Type System (CTS)
Common Language Specification (CLS)
01.12.2013
7
Microsoft Visual Studio
• Quelldatei (engl. Source File)
Datei, in dem der C# Code gespeichert wird.
Diese Datei(en) werden vom Compiler übersetzt
• Projekt (engl. Project)
Ein Projekt fasst Quelldateien zusammen
Aus einem Projekt erzeugt Visual Studio eine Assembly (*.exe, *.dll o.ä.)
• Projektmappe (engl. Solution)
Eine Projektmappe fasst Projekten zusammen
Beispiel: Microsoft Office als Solution; Powerpoint, Word, etc. sind Projekte
• Entwicklungsumgebung (engl. Integrated Development Enviroment)
Integriert Entwicklungstools (Compiler, Editor, Debugger, usw.) zu einer Einheit um
den Entwicklungsprozess zu unterstützen
01.12.2013
8
Syntax und Semantik
• Syntax
Grammatikalische Regeln einer Programmiersprache
Wird vom Compiler forciert, d.h. Compilerfehler wenn Regel verletzt wird
Analogie zu natürliche Sprachen:
•
Ein Satz muss immer Subjekt und Prädikat besitzen
• Semantik
Absicht des Entwickler / Kunden, d.h. was soll das Programm machen.
Kann nicht überprüft werden
•
Tools für spezielle Bereiche vorhanden.
Analogie zu natürliche Sprachen:
•
01.12.2013
Die Aussage vom Satz
9
HelloWorld im Detail
01.12.2013
10
Henne – Ei – Problem
01.12.2013
11
Die Klassenmethode „Main“
static void Main(string[] args) {
Console.WriteLine(“Hello World!“);
}
• Einstiegspunkt des Programm.
Jedes Programm besitzt nur einen Einstiegspunkt
Im Normalfall definiert jedes Programm nur eine Main – Methode
• Beispiele der Veranstaltung definieren mehrere Main – Methoden!
• Details später im Kapitel „Methoden“
Parameter an das Programm werden in args gespeichert.
Die Methode gibt eine ganze Zahl zurück.
•
01.12.2013
Der Wert 0 indiziert eine fehlerfreie Ausführung
12
Quellcode Kommentare
• Lesbarkeit von Quellcode erhöhen
• Kommentare in einem Quellcode werden vom Compiler ignoriert
• Quellcodekommentierung ist eine fundamentale Fertigkeit
• Zeilenkommentar:
// das ist ein Kommentar
Inhalt von // bis Zeilenende wird als Kommentar behandelt
• Blockkommentar:
/* das ist ein Kommentar */
Inhalt von /* bis zum */ wird als Kommentar behandelt (auch bei Zeilenumbrüchen!)
• Dokumentationskommentare
Später im Abschnitt „Methoden“
01.12.2013
13
Konsolenausgabe
Console.WriteLine(<ausdruck>);
Console.Write(<ausdruck>);
• Gültige Werte für <ausdruck> sind:
Strings:
•
Unicode Support
Gleichungen:
Platzhalter:
•
Console.WriteLine(“Das ist ein Text“);
Console.WriteLine(1 + 1);
Console.WriteLine(“1 addiert mit 2 ergibt {0}“, 1 + 2);
Alternativmöglichkeit im Tutorium
• Achtung!
String müssen in Anführungsstrichen geschrieben werden. Ansonsten wird er als
Anweisungen interpretiert, was zu einem Compilerfehler führt.
Vergleiche:
•
•
01.12.2013
Console.WriteLine(“1 + 1“);
Console.WriteLine(1 + 1);
14
Escape Zeichen
• Wie können Sonderzeichen dargestellt werden?
Leerzeichen wie Zeilenumbrüche, Tabulatoren
Internationale Zeichen wie „Một suất thịt chó“ oder chinesische Schriftzeichen
• Escape Zeichen
\\ Backslash
\“ Anführungsstriche
\n
\t
\v
\u
Zeilenumbruch
Tabulator
Vertikale Tabulator
Unicode character (in Hexa FFFF). Bspl: “Pi (\u03a0) and Sigma (\u03a3)„
\x ASCII (in Hexa FF)
01.12.2013
15
Konsoleneingabe
Console.ReadLine();
• Blockiert die Programmausführung bis zur Benutzereingabe
Programm rechnet im Hintergrund nichts nebenbei, sondern wartet auf die Eingabe
des Benutzers. Die Blockierung wird erst aufgehoben, wenn der Benutzer die „Enter“
Taste bestätigt.
• Anweisung lässt sich kombinieren:
Console.WriteLine(Console.ReadLine());
• Was wird bei der folgende Anweisung ausgegeben? Warum?
Console.WriteLine(“Console.ReadLine()“);
01.12.2013
16
Klasse „Program“
• C# ist eine Objektorientierte Programmiersprache
Ein Programm ist ein Objekt, das mit anderen Objekten operiert.
Jedes Objekt gehört zu einer Klasse.
Analogie zur Welt:
•
Mensch als Klasse
•
Jeder Mensch ist ein Objekt der Klasse Mensch
•
Bei der Geburt wird die Funktion „Main“ aufgerufen. Diese wird bis zum Tot ausgeführt.
• Mehr zu Klassen, Objekte und Methoden später!
01.12.2013
17
Namensräume
• Motivation
Um Namenskonflikte (2 unterschiedliche Bedeutungen mit dem selben Namen) zu
vermeiden, gibt es hierarchische Benennungsnormen.
Erklärung am Beispiel: System.Console.WriteLine
•
System
Funktion ist Teil der FCL (Standardfunktionalität von .net)
•
Console
Alle Funktionen bzgl. der Konsole werden in einer Klasse gruppiert
•
WriteLine
eigentliche Funktion
• Abkürzung
using System;
danach kann statt System.Console.WriteLine kurz Console.WriteLine
geschrieben werden
• Tutorium:
Programm schreiben, ohne using zu benutzen
01.12.2013
18
Variablen
01.12.2013
19
Variable: Grundlagen
• Deklaration
Reservieren von Speichern für die Variable
datentyp nameDerVariable;
Beispiel: string name;
• Initialisierung
Zuweisung eines Anfangswertes für die Variable.
Eine Variable muss vorher deklariert werden bevor es initialisiert werden kann.
Allgemeine Syntax: nameDerVariable = wert;
Beispiel: name = „Alf“
• Verknüpfung möglich: Deklaration & Initialisierung
Beispiel: string name = „alf“;
• Mehrere Variablen deklarieren
Beispiel: int a, b, c;
• Initialisierung von einem, mehrere oder alle möglich
Beispiel: int a, b=10, c;
01.12.2013
20
Datentypen
• Zeichenketten
• Boolescher Datentyp
Einzige mögliche Werte sind true oder false
• Ganzzahlige Datentypen
Unterscheidungsmerkmal:
•
Wertebereich und Speicherverbrauch
Vertreter: byte, int, long, usw.
• Fließkommazahlen
Unterscheidungsmerkmal:
•
Wertebereich, Speicherverbrauch, Genauigkeit nach dem Komma
Vertreter: float, double, decimal, usw.
• Weiterführend:
http://msdn.microsoft.com/en-us/library/ms228360%28v=VS.90%29.aspx
http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx
01.12.2013
21
Ganzzahlige Typen
Datentyp
Speicherbedarf in Byte
Wertebereich
sbyte
1
−27
27 − 1
byte
1
0
28
short
2
−215
215 − 1
ushort
2
0
216
int
4
−231
231 − 1
uint
4
0
232
long
8
−263
263 − 1
ulong
8
0
264
char
2
0
216
Weiterführend: http://msdn.microsoft.com/en-us/library/exx3b86w.aspx
01.12.2013
22
Fließkommazahlen
Datentyp
Speicher
Genauigkeit
Wertebereich
float
4
7 Stellen
±1.5e−45 bis ±3.4e38
double
8
15 – 16 Stellen
±5.0e−324 bis ±1.7e308
decimal
16
28 – 29 Stellen
(-7.9 x 1028 bis 7.9 x 1028) / (100 bis 28)
Weiterführend: http://msdn.microsoft.com/en-us/library/9ahet949.aspx
01.12.2013
23
Variablennamen
• Variablennamen
müssen mit einem Unterstrich oder einem Buchstaben beginnen
dürfen Buchstaben (nach Unicode), Ziffern und den Unterstrich enthalten
dürfen keine Leerzeichen enthalten
dürfen keine reservierten C# Schlüsselwörter sein (engl. Keywords)
•
Auflistung: http://msdn.microsoft.com/en-us/library/x53a06bb.aspx
Beispiele: Tồi, ThịtChó,
• Erinnerung: C# unterscheidet zwischen Groß- und Kleinschreibung
Engl. „case-sensitive“
Beispiel: 3 völlig unterschiedliche Variable!
01.12.2013
•
int
meinevariable;
•
string meineVariable;
•
bool
MeineVariable;
24
Namenskonvention
• Camel Case (deutsch: Binnenmajuskel)
Beispiele:
•
personAlter
•
personName,
Mehrere Wörter zusammen schreiben
Anfangsbuchstaben werden groß geschrieben
Allererste Buchstabe wird klein geschrieben
Eigentlich „lowerCamelCase“
• Pascal Case
Beispiele:
•
PersonAlter
•
PersonName
Wie lowerCamelCase, aber allererste Buchstabe wird klein geschrieben
Eigentlich UpperCamelCase
01.12.2013
25
Namenskonvention
• Ungarische Notation
„ Charles Simonyi“, Amerikaner mit ungarische Abstammung
Variablenamen besitzen einen Präfix
•
Datentyp: b, n
•
Verwendungszweck: i (Index), f (Flag)
•
Und weiteres (http://de.wikipedia.org/wiki/Ungarische_Notation)
Beispiel:
•
bTot, nAlter
• Microsoft Guideline
Keine ungarische Notation
Variablen und Parameter in lowerCamelCase
Methoden, Klassen und Namensräume in UpperCamelCase
http://msdn.microsoft.com/en-us/library/ms229002.aspx
01.12.2013
26
Variablen: Theorie
• Variablen
Variablen werden im RAM gespeichert und sind somit „flüchtig“. D.h. Werte gehen
verloren, wenn PC ausgeschaltet wird.
• C# ist eine streng-typisierte Programmiersprache (engl. strongly typed)
Der Typ einer Variable ist vorher festzulegen (Deklaration) und bleibt danach fest!
Gegenteil: „schwach-typisiert“ (engl. weak typed)
•
alf = „Alf Mustermann“, alf = 12;
•
Vertreter: PHP, Visual Basic 6, usw.
In Literaturen auch als „stark typisiert“
Begriffe: statische Typisierung, dynamische Typisierung
01.12.2013
27
Typumwandlung
• Text in Zahl umwandeln
In einem String ist die Zahl „8“ ist für den Computer 56
„56“ für den Computer 2 Zahlen 53 54
•
Parsen nötig!
<typ>.Parse()
Beispiel: Int.Parse(„86“)
• Zahl in Text umwandeln
Beispiel: 56.ToString() oder a.ToString()
ToString() ist für jeden Datentyp definiert.
ToString() wird häufig implizit aufgerufen.
•
Beispiel: „1 + 1 = “ + 1
• Umwandeln zwischen verschiedenen Zahlentypen
Implizite Umwandlung:
•
Von kleineren Typ in größeren Typ (Wertebereich); verlustfreie
Explizite Umwandlung:
•
•
01.12.2013
Verluste können auftreten
Explizite Angabe nötig: typ a = (typ) b;
28
Demo: Typumwandlung
01.12.2013
29
Wertetypen und Verweistypen
• Wertetyp
„Primitiven Typen“
Speichert den Wert
Werden im Stack
gespeichert
Beispiel: int, double, char
01.12.2013
• Verweistyp
„Objekte“
Speichert eine
Speicheradresse, wo der
eigentliche Wert ist
„null“ als Wert möglich
Werden im Heap
gespeichert
Beispiel: string
30
Deklaration mit implizite Typangabe
• Deklaration von Variablen explizite Typangabe
Beispiel: var zahl = 1;
• Keine dynamische Typisierung!
Der Compiler bestimmt zur Kompilierungszeit den Typ
• Konstrukt für anonyme Typen (primär bei LinQ, später)
Microsoft rät selbst in seiner Guideline davon ab, dieses Konstrukt außerhalb zu
nutzen!
„Glaubenskrieg“
01.12.2013
31
Operatoren
01.12.2013
32
Assoziation und Priorität
• Definition: Ausdruck
Ein Ausdruck ist eine Verknüpfung von Variablen, Konstanten und Funktionen durch
Operatoren, die einen Wert zurückliefert.
Beispiel: a + b, c + 2, 1 + 4 * 3,
• Auswertung von Ausdrücken
Priorität von Operatoren (engl. precedence)
•
Beispiel: Punktrechnung vor Strichrechnung
Assoziativität von Operatoren (engl. Associativity)
•
•
Linksassoziativität:
Bei gleiche Priorität, (meisten) von links nach rechts auswerten
Rechtsassoziativität: Bei gleiche Priorität, (meisten) von rechts nach links auswerten
Klammerungen haben stets Vorrang
Meisten Operatoren sind linksassoziativ
• Auflistung alle Operatoren (nach Priorität geordnet)
http://msdn.microsoft.com/en-us/library/ms173145%28v=VS.100%29.aspx
http://msdn.microsoft.com/en-us/library/6a71f45d.aspx
01.12.2013
33
Arithmetische Operatoren
Operator
Funktion
Beispiel
+
Addition
1+2
3
-
Subtraktion
1–2
1
*
Multiplikation
1*2
2
/
Division
1/2
0
%
Restdivision („Modulo“)
1%2
1
Erläuterung:
• 1 / 2 = 0.5
• 0.5 ist keine ganze Zahl! Nachkommastellen werden einfach
weggeschnitten
• Lösungen
• 1.0 / 2 ?
• 1 / 2.0 ?
• (double) 1 / 2 ?
01.12.2013
34
Operatoren sind kontextabhängig
• Anwendung auf String: „Konkatenation“
Beispiel: „1 + 1 = “
+ 1 liefert „1 + 1 = 1“
• Anwendung auf Zahlen: „Addition“
Beispiel: 1 + 1 liefert 2
• Der + Operator hat 2 unterschiedliche Bedeutung, abhängig vom Datentyp
01.12.2013
35
Zusammengesetzte Zuweisungsoperatoren
Operator
Anwendung
Eigentliche Ausdruck
+=
a += 1
a=a+1
-=
a -= 1
a=a–1
*=
a *= 1
a=a*1
/=
a /= 1
a=a/1
%=
a %= 1
a=a%1
Inkrement- und Dekrementoperator
Operator
Anwendung
Eigentliche Ausdruck
++
a++ oder ++a
a=a+1
--
a– oder --a
a=a–1
01.12.2013
36
Demo: x++ Vs. ++x
01.12.2013
37
Boolesche Ausdrücke
(engl. Boolean Expression)
01.12.2013
38
Boolesche Ausdrücke
• Ausgangspunkt: Der Datentyp bool
Beispiel: bool gK; // true oder false
Ab wann ist ein Kunde ein „gute Kunde“?
• Kriterien für Beispiel:
Kunde hat keine Schulden im Schufaverzeichnis
gK = schufa == 0;
Vergleichsoperator
Kunde öffnet Konto mit 5000€
Beschreibung
gK = kapital > 5000;
==
Gleichheit
Kunde hat festes Einkommen
gK = hatEinkommen;
!=
Ungleichheit
<
Kleiner
<=
Kleiner gleich
>
Größer
>=
Größer gleich
• Aussagen verknüpfen?
+ Operator ist nicht definiert!
01.12.2013
39
Logische UND
• Syntax:
Ausdr1 && Ausdr2
Liefert true zurück, wenn Ausdr1 und Ausdr2 wahr ist. Ansonsten immer false.
• Analogie in natürliche Sprache:
•
„Wenn Ausdr1 und Ausdr2 stimmen“
•
„Wenn sowohl Ausdr1 als auch Ausdr2 stimmen“
• Beispiel:
gK = schufa == 0 && kapital > 5000;
• Achtung! Wenn schufa != 0 gilt, wird sofort false zurück gegeben und
der Rest ignoriert! Dieser Umstand nennt sich short-circuiting.
Lösung: Operator & statt && nehmen
01.12.2013
40
Logische ODER
• Syntax:
Ausdr1 || Ausdr2
Liefert nur false zurück, wenn Ausdr1 und Ausdr2 falsch sind. Ansonsten immer
true.
• Analogie in natürliche Sprache:
Nicht mit dem oder aus der natürlichen Sprache verwechseln!
„Wenn mindesten eines von beiden Aussagen gelten“
• Beispiel:
gK = schufa == 0 || kapital > 5000;
• Achtung! Wenn schufa == 0 gilt, wird sofort true zurück gegeben und der
Rest ignoriert! Dieser Umstand nennt sich short-circuiting.
Lösung: Operator | statt || nehmen
01.12.2013
41
Logische NICHT / Negationsoperator
• Syntax:
!Ausdr1
Liefert true zurück, wenn Ausdr1 falsch ist. Ansonsten false.
• Analogie in natürliche Sprache:
„Das Gegenteil“
• Beispiel:
sK = !(schufa == 0 && kapital > 5000);
• Frage: Ein Kunde ist ein schlechte Kunde, wenn er
… wenn er einen Schufa Eintrag hat oder einen Startkapital von <5000€
… wenn er einen Schufa Eintrag hat und einen Startkapital von <5000€
01.12.2013
42
Verzweigungen
(engl. Condition)
01.12.2013
43
Verzweigungen
• if – Anweisung
Syntax: if (boolesche Ausdruck) { Anweisungen }
Anweisungen werden nur ausgeführt, wenn der boolesche Ausdruck wahr
(true) ist.
Der boolesche Ausdruck wird Bedingung genannt.
Geschweifelten Klammern sind bei Einzelanweisung optional.
• if – else – Anweisung
Syntax:
if (boolesche Ausdruck) { iAnweisungen }
else { eAnweisungen }
iAnweisungen werden ausgeführt, wenn die Bedingung erfüllt ist. Ansonsten
werden die eAnweisungen ausgeführt.
Geschweifelten Klammern sind bei Einzelanweisung optional.
01.12.2013
44
Verzweigungen
• Der bedingte Operator
boolesche Ausdruck ? iAusdruck : eAusdruck
Sowohl iAusdruck als auch eAusdruck müssen einen Wert zurückgeben und
dieser muss vom selben Typ sein.
Beispiel:
•
Console.WriteLine(regen == true ? „Es wird nass.“ :
„nice!“);
• Verschachteln
Sowohl iAnweisungen als auch eAnweisungen können selbst eine
Verzweigungsanweisung sein und fortführend.
• else – if – Ketten
Spezielle Form der Verschachtelung um Rechenzeit zu sparen
Der nächste if Block wird nur ausgeführt, wenn die vorherigen Bedingungen nicht
erfüllt sind.
01.12.2013
45
Demo: „e01_else_if.cs“
01.12.2013
46
Beispiel für switch-case
string wday = Console.ReadLine();
switch (wday) {
case "Monday":
Console.WriteLine("Neue Woche");
break;
case "Freitag":
Console.WriteLine("Wochenende!");
break;
default:
Console.WriteLine("Ungültige Wochentag");
break;
}
01.12.2013
47
switch - Anweisung
• Syntax:
switch(ausdruck) {
case wert1:
break;
case wert2:
break;
// …
default:
break;
}
• Alternative für spezielle else – if – Ketten
• default ist optional
01.12.2013
48
switch - Anweisung
• Jeder case muss mit einem break oder einem goto abgeschlossen werden.
Außer leere Fälle!
• Für wert1, wert2, usw. müssen konstante Werte eingesetzt werden. Gültig
sind nur ganzzahlige Konstanten und Strings eingesetzt werden.
Frage: Warum nicht Gleitkommazahlen?
Antwort: Ungenauigkeit
• Mehr Informationen: http://msdn.microsoft.com/en-us/library/06tc147t.aspx
01.12.2013
49
Demo: „e02_switch.cs“
01.12.2013
50
Schleifen
(engl. Loop)
01.12.2013
51
for – Schleifen
• Syntax:
for(Initialisierung; Iterationsbedingung; Iterationsanweisung) {
Anweisungen
}
• Vor Schleife:
Initialisierung ausführen
• Bei jedem Schleifendurchlauf wird:
Davor: Iterationsbedingung prüfen
•
•
Bedingung erfüllt:
Bedingung nicht erfüllt:
Anweisungen ausführen
Code nach Schleife ausführen
Danach: Iterationsanweisung ausführen
• Ein Schleifendurchgang wird Iteration genannt
01.12.2013
52
Demo: „e03_for.cs“
01.12.2013
53
for – Schleifen
• Alle Variablen, die im Initialisierung deklariert und initialisiert werden,
werden Schleifenvariablen genannt und sind nur innerhalb der Schleife gültig,
indem Sie definiert wurden.
• Sowohl Initialisierung, Iterationsbedingung als auch
Iterationsanweisung sind optional.
• Wenn die Iterationsbedingung nicht spezifiziert ist, wird die Schleife
endlos ausgeführt.
• Die geschweiften Klammern sind optional, wenn nur höchsten eine Anweisung
ausgeführt werden soll.
01.12.2013
54
Alternative Schleifenkonstrukte
• Gleichmächtig mit for – Schleife
• while – Schleife
Syntax:
•
while(BoolescheAusdruck) { Anweisungen }
• do – while – Schleife
Mindesten einer Iteration!
Syntax:
•
do {Anweisungen} while(BoolescheAusdruck);
• Achtung: do-while braucht ein abschließendes Semikolon, aber while nicht.
01.12.2013
55
Demo: „e04_while.cs“
01.12.2013
56
Schleifensteuerung
• break
Schleifenausführung komplett beenden
In verschachtelte Schleifen, bezieht break immer nur auf die aktuelle Schleife
• continue
Bricht die Durchführung der aktuellen Iteration ab.
In verschachtelte Schleifen, bezieht continue immer nur auf die aktuelle Schleife
• Einsatzgebiet:
Schleifensteuerungskonstrukte kommen insbesondere bei Endlosschleifen zum
Einsatz
01.12.2013
57
Demo: „e05_break.cs“
01.12.2013
58
Fehlerbehandlung
(engl. Exception Handling)
01.12.2013
59
try - catch
• Syntax:
try {
// …
}
catch(Exception) {
// …
}
• catch – Block wird nur ausgeführt, wenn Fehler auftreten. Man spricht von
„Exceptions geworfen“
• Mehrere catch Blöcke möglich
Ähnlich wie bei switch – case
01.12.2013
60
Erweiterung: finally
• Anweisungen innerhalb von finally werden immer ausgeführt (ob mit oder ohne
Exception).
• Syntax:
try {
// Tue irgendwas
}
catch {
// Tue das, wenn ein Fehler auftritt
}
finally {
// Tue das auf jedenfall!
}
01.12.2013
61
Demo: „e06_try_c.cs“
01.12.2013
62
Was ist ein Array?
• Problemfrage:
Große Anzahl an Variablen (Daten) verarbeiten
Beispiel:
•
Pixel eines Bildes: mehrere Millionen Pixel
•
Native Lösung: Pixel pixel1, pixel2,…,pixel1000000;
• Lösung: Arrays!
Definition: „Mehrere Variablen desselben Typs, die sich denselben Bezeichner teilen,
werden als Array bezeichnet.“
Synonym: Datenfelder
01.12.2013
63
Array deklarieren
• Arrays müssen wie Variablen vor Ihrer Nutzung deklariert werden.
• Beispiele:
int[]
zahlen;
string[] namen;
• Syntax:
type[] identifier;
• Vergleich zur Deklaration von Variablen
int
zahl;
string
01.12.2013
name;
64
Array initialisieren
• Im Gegensatz zu Variablen müssen, Arrays vor Ihrer Nutzung initialisiert werden.
• Beispiel:
zahlen
namen
= new int[10];
= new string[100];
• Syntax:
identifier = new type[anzahl];
Selbige Typ von der Deklaration
• Kombinierbar:
type identifier = new type[anzahl];
• Die einzelnen Variablen des Arrays werden automatisch mit 0, null oder false
abhängig von ihrem Datentyp initialisiert. Die Variablen werden als Elemente
bezeichnet.
01.12.2013
65
Zugriff auf Elemente des Arrays
• Beispiel:
Console.WriteLine(namen[0]);
• Syntax: Lesezugriff
identifier[index];
• Syntax: Schreibzugriff
identifier[index] = wert;
• Die Zählung beginnt mit 0.
• Überschreitet index die Größe vom Array, wirft .net eine Exception zurück
Schutzmaßnahme gegen Angriffe
01.12.2013
66
Demo: „e01_init.cs“
Arrays deklarieren und initialisieren
Zugriff auf die Elemente vom Array
01.12.2013
67
Wertzuweisung bei der Initialisierung
• Beispiel:
string[] superhelden = new string[4] {
"Bruce Wayne", "Peter Parker", "Clark Kent", "Bruce Banner"
};
•
Syntax
type[] identifier = new type[] {
e1,e2,e3,…
};
•
Unabhängig von der Deklaration möglich
type[] identifier = new type[] {
e1,e2,e3,…
};
•
Dieses Sprachkonstrukt steht nur bei der Initialisierung des Array zur Verfügung!
01.12.2013
68
Initialisierung vom Array und Elementen
• Der Begriff Initialisierung ist bei Arrays zweideutig.
Initialisierung des Arrays
Initialisierung der Elemente vom Array.
• Die Deklaration ist nur für das Array selbst notwendig. Die Deklaration der
Elemente ist implizit.
• Technische Details:
Was passiert bei der Deklaration des Array?
Was passiert bei der Initialisierung des Array?
Was passiert bei der Initialisierung der Elemente vom Array?
• Achtung! Die Größe eines Arrays ist fest
Frage: Größe von Array verändern?
01.12.2013
69
foreach - Schleife
• Funktion:
Alle Elemente eines Arrays einmal durchlaufen
Nur Lesezugriff
• Syntax
type array = new type[numb];
foreach(type x in array) { expr }
• Beispiel
foreach (int x in zahlen) {
// Wertezuweisung ist nicht möglich
// x *= 2;
Console.Write(x + "\t");
}
01.12.2013
70
Nützliche Funktionen
Funktion
Beschreibung
v.Length
Anzahl vom Array v
Häufig auch als Länge bezeichnet
Array.Sort(v)
Array v sortieren
Array.Sort(k,v)
Array v mit k verknüpfen und v anschließend mit k als
Kriterium sortieren
Array.Reserve(v)
Die Anordnung umkehren
Array.CopyTo(s,si,d,di,n)
Kopiert n Element von Array s (ab Index si) in Array d (ab
Index di)
• Klasse „System.Array“
• Weitere Funktionen verfügbar!
http://msdn.microsoft.com/en-us/library/system.array.aspx
01.12.2013
71
Demo: „e02_utils.cs“
Anwendung von Standardfunktionalitäten
01.12.2013
72
Array duplizieren
• Achtung! Fehler: (siehe „e03_dupl.cs“)
int[] X = new int[] {
1,2,3,4,5,6,7,8,9
};
int[] Y = X;
• Semantische Fehler!
Die beiden Verweise X und Y zeigen auf dasselbe Array im Heap.
• Lösung: (Pseudocode)
Leeren Array erzeugen mit selbige Länge wie Quellarray
Alle Elemente kopieren
• Oder über v.Clone() und Casten
01.12.2013
73
Demo: „e03_dupl.cs“
Anwendung von Standardfunktionalitäten
01.12.2013
74
Mehrdimensionale Arrays
• Syntax: 2D Array
type[,] = new type[r,c];
• Beispiel: 2D Array
byte [,] Bild = new byte[1920, 1080];
• Syntax: 3D Array
type[,,] = new type[x,y,z];
• Dimension unbegrenzt!
• Vorsicht! Nutzung von n-dimensionale Arrays
Speicherverbrauch: 𝑑1 ∗ 𝑑2 ∗ 𝑑3 ∗ ⋯ 𝑑𝑛
Beispiel: 1 Sekunde HD-Film
•
01.12.2013
1920 ∗ 1080 ∗ 25 = 51.840.000 (ca. 51 MB)
75
Klasse ArrayList
• Abstraktion von einem Array mit variable Länge
• Mischen von Typen innerhalb einer Liste erlaubt: String, int, etc.
• Neues Elemente aufnehmen
alist.Add(e)
alist.Insert(pos, e)
e der alist hinzufügen
e der alist an der Position pos hinzufügen
• Elemente aus der Liste löschen
alist.Remove(e)
alist.RemoveAt(i)
01.12.2013
Element e aus der Liste entfernen
Element an der Position i entfernen
76
Demo: „e04_alist.cs“
Erstellen einer ArrayList
Hinzufügen und Entfernen von Elementen
01.12.2013
77
Vielen Dank für die
Aufmerksamkeit
http://www.draphony.de
facebook.com/DraphonyGames
01.12.2013
78