programmiersprache c# - staff.hs-mittweida.dethiem1/cpp/unterlagen/kap07/theorie07n.pdf · dr. elfi...
TRANSCRIPT
Dr. Elfi Thiem Folie 1
Programmiersprache C#
Dr.-Ing. Elfi Thiem
Literatur:
C# Einführung in die neue Programmiersprache C#
RRZN-Heft Regionales Rechenzentrum für Niedersachsen / Universität Hannover, April 2004 http://csharp-buch.uni-hd.de
C# Professionelle Programmierung mit Visual Studio.NET, Kompendium,
Schäpers, Huttary, Brems
Markt+Technik-Verlag, 2004
Dr. Elfi Thiem Folie 2
Historie der Programmiersprachen
Dr. Elfi Thiem Folie 3
Anlegen eines Projektes mit Studio.Net
(Konsolenanwendung)
Menü: Datei Neu Projekt
Projekttyp: Visual C# - Projekte und Vorlagen: Konsolenanwendung auswählen
Speicherort und Name festlegen.
Gegebenenfalls vorher einen Ordner anlegen.
Dr. Elfi Thiem Folie 4
Aufruf des Hauptprogramms in den Sprachen
C/C++, Java u. C#
• C und C++:
int main() beziehungsweise
void main()
• Java: public static void main (String [ ] args)
• C#:
public static void Main (string [ ] args) beziehungsweise
public static void Main()
Am Aufruf des Hauptprogramms in diesen Sprachen, kann man erkennen, dass C#
sowohl von C/C++ als auch von Java Anleihen genommen hat.
Dr. Elfi Thiem Folie 5
Quellcode: HelloCsharp.cs
Projekt öffnen: bsp\Visual Studio Projects\HelloCsharp\HelloCsharp.csproj
1 public class HelloCsharp
2 {
3 public static void Main()
4 {
5 System.Console.WriteLine(
"Hallo, viel Spass mit C#!");
6 }
7 }
Ausgabe:
Miniversion eines C# - Programms
• C#-Programme haben die Dateiendung (Suffix)
.cs
• Ein C# -Programm besteht aus mindestens
einer Klassen-Definition.
• Der Name der Klasse muss mit dem Datei-
namen der Datei identisch sein.
• Die Methode, die den Code enthält, trägt den
Namen Main.
• Das Schlüsselwort public in Zeile 1 und 3 ist
nicht zwingend.
• Das Schlüsselwort static ist notwendig, da die
Methode Main ohne ein Objekt, dem sie
zugeordnet werden könnte, aufgerufen wird.
• void wird verwendet um anzuzeigen, dass die
Methode Main kein Ergebnis zurück gibt.
• Mit der Methode WriteLine wird die
Zeichenkette Hallo, viel Spaß mit C#! am
Bildschirm ausgegeben. Die Methode
WriteLine gehört zur Klasse Console, und
diese ist im Namensraum System zu finden.
Erläuterung:
Dr. Elfi Thiem Folie 6
Quellcode: HelloCsharp1.cs
Projekt öffnen: bsp\Visual Studio Projects\HelloCsharp\HelloCsharp.csproj
1 using System;
2 public class HelloCsharp1
3 {
4 public static void Main()
5 {
6 Console.WriteLine("Hallo, viel
"Spass mit C#!");
7 }
8 }
Ausgabe:
C# - Programm unter Verwendung eines Namensraums
Zeile 1:
Durch Angabe des Namensraums System
wird festgelegt, dass das Programm die
Bezeichner bzw. Namen aus diesem
Namensraum verwendet.
Zeile 7:
Aus diesem Grund kann der Aufruf der
Methode WriteLine auf die Angabe des
Namens der Klasse Console reduziert
werden.
Erläuterung:
Dr. Elfi Thiem Folie 7
Quellcode: HelloCsharp2.cs
Projekt öffnen: bsp\Visual Studio Projects\HelloCsharp2\HelloCsharp2.csproj
1 using System;
2
3 public class HelloCsharp2
4 {
5 public static void Main()
6 {
7 Console.WritLine("**********************************\n"
8 + "* *\n"
9 + "* Hallo, viel Spass mit C# ! *\n"
10 + "* *\n"
11 + "**********************************"); 12 }
13 }
Ausgabe:
C# - Programm: Ausgabe mit Console.WriteLine() u.
Verkettungsoperator +
Zeilen 7-11:
In diesen Zeilen wird die Bildschirm-
ausgabe erzeugt.
Die Escape-Sequenz \n sorgt für die
Ausgabe in mehreren Zeilen.
Die Teil-Zeichenketten werden
durch den Operator + (Verkettungs-
operator) zu einer einzigen Zeichen-
kette zusammengefügt (verkettet).
Erläuterung:
Dr. Elfi Thiem Folie 8
Quellcode: Addition.cs
Projekt öffnen: bsp\Visual Studio Projects\Addition\Addition.csproj
1 using System; 2
3 public class Addition
4 {
5 public static void Main()
6 {
7 int zahl1,zahl2,summe;
8
9 zahl1=22;
10 zahl2=38;
11 summe=zahl1+zahl2;
12 Console.WriteLine(zahl1+"+"+zahl2+"="+ summe);
13 }
14 }
Ausgabe:
22+38=60
C# - Programm: Ausgabe mit Verkettungsoperator + u.
Variablen
Zeile 11:
Der Inhalt der Variablen zahl1 und zahl2
wird addiert und das Ergebnis in der
Variablen summe abgelegt.
Zeile 12:
Der Inhalt der Variablen zahl1, das
Zeichen Plus, der Inhalt der Variablen
zahl2, das Gleichheitszeichen und der
Inhalt der Variablen summe werden
verkettet (zu einer Zeichenkette zusam-
mengefügt) und mit der Methode
WriteLine am Bildschirm ausgegeben.
Erläuterung:
Dr. Elfi Thiem Folie 9
Quellcode: Aus002.cs
Projekt öffnen: bsp\Visual Studio Projects\Aus002\Aus002.csproj
1 using System;
2
3 public class Aus002
4 {
5 public static void Main()
6 {
7 int i=9, j=1234567;
8
9 Console.WriteLine("i enthält {0} und j enthält {1}.",i,j);
10 }
11 }
Ausgabe:
C# - Programm: Formatierte Ausgabe mit
Console.WriteLine()
Zeile 9:
Die Zeichenkette, die auf dem Bildschirm
ausgegeben werden soll, wird zunächst
mit Platzhaltern für die einzelnen Variab-
len geschrieben.
{ 0 } steht dabei für die erste Variable, {1}
für die zweite Variable.
Die Variablen selbst werden am Ende der
Zeichenkette durch Kommata getrennt
angegeben.
Erläuterung:
Dr. Elfi Thiem Folie 10
Quellcode: Aus002.cs
Projekt öffnen: bsp\Visual Studio Projects\Aus002\Aus002.csproj
1 using System;
2
3 public class Aus002
4 {
5 public static void Main()
6 {
7 int i=9, j=1234567;
8
9 Console.WriteLine("i enthält {0} und j enthält {1}.",i,j);
10 }
11 }
Ausgabe:
C# - Programm: Formatierte Ausgabe mit
Console.WriteLine()
Zeile 9:
Ausrichtung einer Zeichenfolge wird nach
dem Parameterbezeichner durch ein
Komma getrennt eine Zahl (Anzahl der
Zeichen) angeben.
Das auszugebende Argument wird rechts-
bündig in dieses Feld eingesetzt.
Bei negativer Zahl für die Feldbreite,
linksbündig eingetragen.
Eventuell fehlende Zeichen werden durch
Füllzeichen (Leerzeichen) ersetzt.
Ist weniger Platz reserviert als benötigt wird,
wird das Feld automatisch nach rechts bis
zur benötigten Feldbreite vergrößert.
{0,6}
{0,6:F2} bei Gleitkommazahlen
2 Stellen nach dem Komma
Erläuterung:
Dr. Elfi Thiem Folie 11
Quellcode: TastaturI.cs
Projekt öffnen: bsp\Visual Studio Projects\TastaturI\TastaturI.csproj
7 int zahl1, zahl2;
8
9 Console.WriteLine("Bitte erste Zahl eingeben:");
10 zahl1= Int32.Parse(Console.ReadLine());
11 Console.WriteLine ("Bitte zweite Zahl eingeben:");
12 zahl2= Int32.Parse(Console.ReadLine());
13
14 Console.WriteLine("Die Summe der Zahlen
ist: " + (zahl1 + zahl2));
Ausgabe:
C# - Programm: Eingabe mit Console.ReadLine()
Zeile 10:
Die Eingabe wird durch die Methode
Console.ReadLine () von der Tastatur
eingelesen.
Auch für die Eingabe von der Tastatur gilt,
dass die eingegebenen Werte Zeichen-
ketten sind. Es müssen die eingegebene Werte vor der Benutzung in die entsprechende Zahl konvertiert werden.
Beispiele:
int
Int32.Parse (Console.ReadLine () );
float
Single.Parse(Console.ReadLine());
duoble
Double.Parse(Console.ReadLine();
Weitere Konvertierung: • Byte.Parse(zeichenkette)
• Char.Parse(zeichenkette)
• Int16.Parse(zeichenkette)
• Int64.Parse(zeichenkette)
Erläuterung:
Dr. Elfi Thiem Folie 12
Quellcode: Parameter.cs
1 using System;
2
3 public class Parameter
4 {
5 public static void Main(string [ ] args)
6 {
7 Console.WriteLine("Anzahl der Parameter:" + args.Length + "\n"
8 + "Erster Parameter: " + args[0] +"\n"
9 + "Zweiter Parameter: " + args[1] +"\n"
10 + "Dritter Parameter: " + args[2] );
11 }
12 }
13
Aufruf:
Parameter eins zwei drei
Ausgabe:
Anzahl der Parameter: 3
Erster Parameter: eins
Zweiter Parameter: zwei
Dritter Parameter: drei
C# - Programm: Eingabe beim Programmaufruf
Bei einer Parameterübergabe beim Pro-
grammaufruf werden die Werte an die
Methode Main () übergeben.
Deshalb wird die Methode Main von
public static void Main() zu
public static void Main(string [ ] args)
geändert.
Dadurch wird ein Array args (arguments)
übergeben, dem die Eingabewerte zuge-
ordnet und von der Methode Main ausge-
lesen werden können.
Die einzelnen Parameter, die man beim
Programmaufruf übergibt, werden durch
Leerzeichen getrennt.
Zeilen 7-10:
Der für die Übergabe der Parameter
verwendete Arrayname ist args. Mit args .
Length erhält man die Anzahl der über-
gebenen Parameter, in diesem Fall sind das
drei. Die einzelnen Parameter bekommt man
mit args [ 0 ] für den ersten, args [ 1 ] für den
zweiten und args [ 2 ] für den dritten
Parameter.
Erläuterung:
Dr. Elfi Thiem Folie 13
Quellcode: ParameterI.cs
1 using System;
2
3 public class ParameterI
4 {
5 public static void Main(string[ ] args)
6 {
7 int zahl1, zahl2;
8
9 zahl1 = Int32.Parse (args [0] );
10 zahl2 = Int32.Parse (args [1] );
11
12 Console.WriteLine("Die Summe der Zahlen ist: " + (zahl1 + zahl2));
13 }
14 }
Aufruf:
ParameterI 11111 22222
Ausgabe:
Die Summe der Zahlen ist: 33333
C# - Programm: Eingabe beim Programmaufruf
In C# wird immer eine Zeichenkette über-
geben. Um mit diesen Werten rechnen zu
können, müssen sie zuerst in Datentypen
für Zahlen konvertiert werden.
Zeile 9:
Der Wert, der als erster Parameter über-
geben wurde, d.h. der in args [0] enthalten
ist, wird durch die Methode Int32.Parse() in
eine ganze Zahl konvertiert und dann der
Variablen zahl1 zugewiesen.
Zeile 10:
Das Gleiche geschieht mit dem zweiten Pa-
rameter, das Ergebnis wird der Variablen
zahl2 zugewiesen.
Beim Konvertieren muss der Datentyp der
Variablen berücksichtigt werden. Im näch-
sten Beispiel wird der Datentyp double statt
int verwendet.
7 double zahl1, zahl2;
8
9 zahl1 = Double.Parse (args [0] );
10 zahl2 = Double.Parse (args [1] );
12 Console.WriteLine ("Die Summe der
Zahlen ist: " + (zahl1 + zahl2));
Erläuterung:
Dr. Elfi Thiem Folie 14
Quellcode: Verzweig.cs Projekt öffnen: bsp\Visual Studio Projects\verzweig\verzweig.csproj using System;
public class Verzweig
{public static void Main( )
{
int zahl1, zahl2;
Console.WriteLine("Bitte erste Zahl eingeben:");
zahl1 = Int32.Parse(Console.ReadLine());
Console.WriteLine("Bitte zweite Zahl eingeben:");
zahl2 = Int32.Parse(Console.ReadLine());
if(zahl1==zahl2)
Console.WriteLine("Die Zahlen sind gleich.");
else
Console.WriteLine("Die Zahlen sind nicht gleich.");
}
}
C# - Programm: Verzweigung “ if, if-else“
if-else- Anweisung
if (Bedingung)
Anweisung 1;
else
Anweisung 2;
Anweisung 3;
if- Anweisung
if (Bedingung)
Anweisung 1;
Anweisung 2;
Ausgabe:
Dr. Elfi Thiem Folie 15
Quellcode: Verzweig33.cs
Projekt öffnen: bsp\Visual Studio Projects\verzweig33\verzweig33.csproj
using System;
public class Verzweig33
{public static void Main()
{
int zahl;
Console.WriteLine ("Bitte erste Zahl eingeben:");
zahl = Int32.Parse (Console.ReadLine () );
switch(zahl)
{case 1:
Console.WriteLine("Die Zahl ist eins.");
break;
case 2:
Console.WriteLine("Die Zahl ist zwei.");
break;
case 3:
Console.WriteLine("Die Zahl ist drei.");
break;
case 4:
case 5:
Console.WriteLine("Die Zahl ist vier oder fünf.");
break;
default:
Console.WriteLine("Die Zahl ist weder eins, zwei, ..." + "oder fünf.");
break;}
}}
C# - Programm: Verzweigung “Swich“
Es wir d der Ausdruck nach switch berechnet.
Diese Ausdruck wird dann mit den Konstanten
er einzelnen case-Anweisungen verglichen.
Ist das Ergebnis des swich-Ausdrucks mit dem
Wert einer case-Anweisung identisch, dann
wird diese Anweisungen ausgeführt.
Im Gegensatz zu anderen C-Sprachen ist
die break-Anweisung bei C# zwingend.
Ein Fehlen führt zu einer Fehlermeldung!
Die Anweisung nach der default-Klausel kom-
men dann zur Ausführung, wenn mit keiner
case-Anweisung Übereinstimmung vorliegt.
Wird eine der Anweisung ausgeführt, wird am
Ende der switch-Anweisung fortgefahren.
Erläuterung:
Ausgabe:
Dr. Elfi Thiem Folie 16
Quellcode: sum2five.cs Summe von 1 bis 5
1 using System;
2
3 public class Sum2five
4 public static void Main()
6 {
7 int zahl,summe;
8
9 summe=0;
10
11 for(zahl=1; zahl<=5; zahl=zahl+1)
12 {
13 summe = summe+zahl; 14 }
15
16 Console. WriteLine("Die Summe der Zahlen ist " + summe + ".");
17 }
C# - Programm: Wiederholungen “Die For-Schleife“
Mit einer Schleife kann man Programmteile
wiederholt ausführen lassen. Dazu kann die
for-Schleife benutzt werden.
Die einfachste Form der for-Schleife ist:
for (Initialisierung; Bedingung;
Wiederholung) Schleifenanweisung.
• Die Initialisierung setzt die
Schleifenvariable auf einen Startwert.
• die Bedingung entscheidet, ob die Schleife
ausgeführt werden soll.
• die Wiederholung gibt an, wie die
Schleifenvariable bei jedem
Schleifendurchgang verändert werden soll.
FOR - Anweisung for(Initialisierung;Bedingung; Wiederholung)
Schleifenanweisung;
Erläuterung:
Ausgabe:
Dr. Elfi Thiem Folie 17
Ausgabe:
Quellcode: GetAns01.cs Projekt öffnen: bsp\Visual Studio Projects\GetAns01\GetAns01.csproj
1 using System;
2 public class GetAns01
3 {
4 public static void Main()
5 {
6 string antw;
7
8 do
9 {
10 Console.WriteLine("Bitte Ja/Nein eingeben:");
11 antw=Console.ReadLine();
12 }
13 while(antw!="Ja" && antw!="Nein");
14 Console.WriteLine("Fertig!");
15 }
16 }
C# - Programm: Wiederholungen “while, do-while“
Kopfgesteuerte Schleife
Fußgesteuerte Schleife
.
while (Bedingung)
Anweisung;
do
Anweisung;
while (Bedingung);
Erläuterung:
Dr. Elfi Thiem Folie 18
C# - Programm: Arrays (Felder, Vektoren)
Zugriff erfolgt über Indizes.
Indizierung beginnt immer mit Null.
Beim Deklarieren einer Referenz müssen
die eckige Klammern [ ] hinter dem
Datentyp stehen.
Das Reservieren des Speicherplatzes im
Heap übernimmt der Befehl new.
1. Anlegen einer Referenz
Syntax: datentyp [] bezeichner;
2. Anlegen des Array mit einer anzahl von
Arrayelementen
Syntax:
bezeichner = new datentyp [anzahl];
3. Initialisieren der Arrayelemente, Beispiel mit
wert1, wert2
Syntax: bezeichner[0]=wert1;
bezeichner[1]=wert2;
4. Das anlegen einer Referenz und des Arrays
wird in einer Anweisung zusammengefasst Syntax:
datentyp[]bezeichner=
new datentyp[anzahl];
Erläuterung:
Erläuterung:
Dr. Elfi Thiem Folie 19
Quellcode: Array01.cs
Projekt öffnen: bsp\Visual Studio Projects\Array01\Array01.csproj
1 using System;
2 public class Array01
3 {
4 public static void Main()
5 {int[] zahlen;
6 zahlen = new int[6];
7
8 zahlen[0]=1; zahlen[1]=2; zahlen[2]=3;
9 zahlen[3]=4; zahlen[4]=5; zahlen[5]=6;
10
11 for (int i=0 ; i<=5 ; i++)
12 Console.Write("{0,3}",zahlen[i]);
13 Console.WriteLine();
14
15 int[] zahlen2 = new int[7];
16
17 zahlen2[1]=1; zahlen2[2]=2; zahlen2[3]=3;
18 zahlen2[4]=4; zahlen2[5]=5; zahlen2[6]=6;
19
20 for (int i=1 ; i<=6 ; i++)
21 Console.Write("{0,3}",zahlen2[i]);
22 Console.WriteLine();
23 }
24 }
C# - Programm: Arrays (Felder, Vektoren)
Zeile 5:
Deklaration einer Referenz mit Namen
zahlen für den Datentyp int
Zeile 6:
Mit Anweisung new wird im Heap
Speicherplatz für 6 Arrayelemente vom
Datentyp int reserviert.
Zeile 8-9:
Den 6 Arrayelementen werden Werte
zugewiesen mit Index=0 beginnend.
Zeile 15:
Deklaration einer Referenz mit Namen
zahlen2 für den Datentyp int und
mit new eine Reservierung für sieben
Arrayelemente von Datentyp int.
Erläuterung:
Ausgabe:
Dr. Elfi Thiem Folie 20
C# - Programm: Übungsaufgaben
Aufgaben:
1. Schreiben Sie das Beispielprogramm zur Berechnung der Länge eines Marathonlaufs in Kilometern ab.
Rufen Sie den C# - Compiler auf, und sehen Sie sich das Ergebnis Ihres Programms auf dem Bildschirm an. Sollten
Sie das erwartete Ergebnis nicht erhalten, so versuchen Sie, den Fehler zu korrigieren.
War alles auf Anhieb fehlerfrei, so schicken Sie das Programm noch einmal ab, aber versehen Sie es absichtlich mit
einem Syntaxfehler. „Vergessen" Sie beispielsweise ein Semikolon. Beachten Sie die Fehlermeldungen des
Compilers.
2. Berechnen Sie den Durchschnitt der folgenden Zahlen
5, 9, 4, 17, 3,
die Sie den Variablen a, b, c, d und e zugewiesen haben. (Ergebnis: 7,6)
3. Schreiben Sie ein Programm, das nach der Eingabe der gefahrenen Kilometer und der Menge des verbrauchten
Kraftstoffs den Durchschnittsverbrauch auf 100 km berechnet und ausgibt.
4. Gegeben sind die Zahlen 1.234 und 5.678. Berechnen Sie die Summe, die Differenz, das Produkt und den
Quotienten dieser Zahlen und geben Sie die Ergebnisse am Bildschirm aus.
5. Im Gegensatz zu Deutschland wird beispielsweise in den USA die Temperatur statt in °C (Grad Celsius) in °F (Grad
Fahrenheit) gemessen.
Schreiben Sie ein Programm, das die Temperatur 100°F in °C umrechnet.
Die Formel ist: temperatur °C = 5/9(temperatur °F - 32)
6. Erstellen Sie ein Programm, das zwei Gleitkommazahlen übergeben bekommt und die erste Zahl durch die zweite
Zahl dividiert. Eine drohende Division durch 0 soll das Programm erkennen und, statt zu dividieren, eine
Fehlermeldung ausgeben.
Dr. Elfi Thiem Folie 21
Beispiel: class Punkt
{
int x; //x-Koordinate
int y; //y-Koordinate
zeichnen();
}
C# - Programm: Klassen und Objekte
Eine Klasse stellt die statische Beschreibung
gleichartiger Objekte dar.
Die Klasse dient als Schablone zur
Erzeugung von Objekten.
Sie enthält:
• Attribute, jeweils mit Namen und Datentyp
sowie
• Methoden, d.h. Schnittstellen und ihre
Implementierung.
Die Objekte werden Instanzen der Klasse
genannt. Jedes Objekt ist Instanz genau
einer Klasse.
Die Instanzen einer Klasse besitzen alle die
gleichen Attribute und Methoden.
Verschiedene Instanzen haben meist
unterschiedliche Attributwerte.
Syntax: modifier class klassenname
{
Komponenten der Klasse
}
public class klassenname
{
// Deklaration der Attribute
// Deklaration der Methoden
}
Klasse:
Dr. Elfi Thiem Folie 22
Als Parameter für modifier sind folgende Modifikatoren möglich, die die Zugriffsrechte auf ein Datenelement regeln.
Sie werden oft auch als Zugriffsmodifizierer bezeichnet.
• public,
• internal,
• abstract,
• sealed.
C# - Programm: Zugriff auf Klassen
public
Mit diesem Modifizierer werden Klassen mit öffentlichem
Zugriff eingerichtet, d. h. jede andere Klasse kann auf
diese Klasse zugreifen - jeder Zugriff von außerhalb ist
möglich.
internal
Mit dem Modifizierer internal wird der Zugriff der Klasse
auf das Assembly eingeschränkt, in welchem die Klasse
definiert wurde. Unter einem Assembly versteht man eine
Datei oder mehrere Dateien, die sämtlichen Programm-
teile enthält. Kurz gesagt ist eine Klasse, die mit internal
gekennzeichnet ist, nur im Programm bekannt.
abstract
Dieser Modifizierer steuert eigentlich nicht den Zugriff auf
eine Klasse. Eine abstrakte Klasse enthält in ihren
Methoden keinen Code und muss daher vor ihrer
Verwendung abgeleitet werden. Die abgeleitete Klasse
kann dann den eigentlichen Code für die Methode
implementieren.
sealed
Eine versiegelte (sealed) Klasse verhindert, dass von ihr
weitere Klassen abgeleitet werden können. Es findet
dadurch keine Vererbung mehr statt.
Syntax: modifier class klassenname
{
Komponenten der Klasse
}
Dr. Elfi Thiem Folie 23
C# - Programm: Zugriff auf Komponenten der Klasse
Standardmäßig sind alle Komponenten einer Klasse private, d. h. sie können nur innerhalb der Klasse
verwendet werden. Jeder Zugriff von außen wird unterbunden. In C# wird der Zugriff mit Hilfe von fünf
so genannten Zugriffsspezifizierern (modifier) gesteuert.
public
Der Zugriff auf die Komponenten einer Klasse von außerhalb ist uneingeschränkt möglich.
protected
protected gibt an, dass alle Komponenten nur von dieser Klasse oder allen von ihr abgeleiteten
Klassen angesprochen werden können.
internal
Bei internal können zwar die Komponenten von außerhalb der Klasse, aber nur innerhalb des
aktuellen Projekts angesprochen werden, d. h. der Zugriff ist auf das Assembly eingeschränkt. Ein
Assembly besteht grob gesagt aus all jenen Programmteilen, die zusammen übersetzt wurden (vgl.
Kap. B).
internal protected
Der Zugriff internal protected ist eine Mischform von internal und protected. Damit kann auf die
Komponenten von dieser Klasse, allen abgeleiteten Klassen und innerhalb des Assembly zugegriffen
werden.
private
Ein Zugriff von außen ist nicht möglich. Alles ist nur innerhalb der Klasse sichtbar, in der es deklariert
wurde.
Dr. Elfi Thiem Folie 24
C# - Programm: Methoden und Prozesse
Methode
Methoden sind Funktionen, die beim Eintreffen einer Nachricht Operationen mit bzw. über einem Objekt
durchführen. Methoden enthalten Algorithmen, die über der Datenstruktur eines Objektes arbeiten. Die
Methoden stellen die Schnittstelle zum Anwender dar. Er muss die Namen der Methoden sowie ihre
Parameter kennen.
Es gibt zwei ausgezeichnete Methoden für jede Klasse.
• Konstruktor und
• Destruktor.
Der Konstruktor wird aufgerufen, wenn ein Objekt instanziert wird.
Der Destruktor wird aufgerufen wenn es zerstört wird.
Prozess
Der Prozess charakterisiert den dynamischen Teil einer Methode. Wird eine Methode zur Laufzeit eines
Programms abgearbeitet, so bezeichnet man diesen Vorgang als Prozess oder englisch Thread.
Nachricht
Nachrichten dienen als Mittel der Interaktion zwischen Objekten und auch zum Anwender. Eine
Nachricht ist eine Aufforderung an ein Objekt, eine Operation mit den in der Nachricht angegebenen
Parameter durchzuführen. Sie setzt sich aus drei Teilen zusammen:
Name des Empfängerobjekts,
Name der Methode, die ausgeführt werden soll,
Gegebenfalls weitere Übergabeparameter für die Methode.
Dr. Elfi Thiem Folie 25
Quellcode: EinAus01.cs Projekt öffnen: bsp\Visual Studio Projects\EinAus01\EinAus01.csproj
1 using System;
2
3 class EinAus01
4 {
5 public static void Main()
6 {
7 EinAus01 ea1 = new EinAus01();
8 ea1.einausgabe();
9 }
10
11 public void einausgabe()
12 {
13 Console.WriteLine("Bitte Namen eingeben:");
14 Console.WriteLine("Hallo "+ Console.ReadLine());
15 }
16 }
C# - Programm: Aufbau von Methoden
• Die Methode besteht aus Methodenkopf und
Methodenkörper.
• Der Methodenkopf enthält den Namen der
Methode.
• Davor steht der Datentyp des Wertes, den
die
Methode zurückgibt. Vor dem Rückgabe-
Datentyp steht ein Zugriffsspezifizierer, der
festlegt, wer die Methode aufrufen darf.
• Im Anschluss an den Namen folgt, in runden
Klammern eingeschlossen, die Liste der
Parameter, die die Methode übergeben
bekommt.
Syntax: zugriffsspezifizierer rückgabedatentyp
methodenname(parameterliste)
{
// Anweisungen
}
Ausgabe:
Dr. Elfi Thiem Folie 26
call by value
Quellcode: Mult01.cs
12 public int mult (int x, int y)
13 {
14 int h;
15 h = x * y;
16 return h;
17 }
call by reference Schlüsselwort ref double xWert=0.0, yWert=0.0;
punkt.getxyWert(ref xWert,ref yWert);
Schlüsselwort out punkt.getxyWert(out xWert, out yWert);
C# - Programm: Aufbau von Methoden
An Methoden können Parameter übergeben
werden, die sich innerhalb der Methode wie
lokale Variablen verhalten. Mehrere Parameter
werden durch Kommata getrennt. Bei der Rück-
kehr zur aufrufenden Methode kann ein einzelner
Wert zurückgeben werden. Der Datentyp des
Rückgabewerts wird bei der Definition vor dem
Methodennamen angegeben. Die Rückgabe
geschieht durch die Anweisung return.
Mit diesem Schlüsselwort ref wird bei einem Me-
thodenaufruf nicht der Wert der Variablen son-
dern eine Referenz auf die Variable übergeben
(call by reference). Die Konsequenz ist, das der
Wert der ursprünglichen Variable in der Methode
geändert werden kann. Die mit ref übergebenen
Parameter müssen vorher initialisiert werden.
Das Schlüsselwort out ist dem Schlüsselwort ref
ähnlich. Out setzt jedoch nicht die vorherige Initi-
alisierung der übergebenen Parameter voraus.
Die Methode muss den Parametern aber nun
zwingend Werte zuweisen.
call by value:
call by reference:
Dr. Elfi Thiem Folie 27
Quellcode: punk0I.cs Projekt öffnen: bsp\Visual Studio Projects\Punkt0I\Punkt0I.csproj
1 using System;
2
3 class Punkt0l
4 {
5 int xWert,yWert;
6
7 Punkt0l (int xWert, int yWert)
8 {
9 this.xWert=xWert;
10 this .yWert=yWert;
11 }
12
13 void getxyWert(ref double xWert,ref double yWert)
14 {
15 xWert=this.xWert;
16 yWert=this.yWert;
17 }
18
19 static void Main(string [] args)
20 {
21 Punkt0l pkt = new Punkt0I (5, 10) ;
22 double xWert=0.0, yWert=0.0;
23
24 pkt.getxyWert (ref xWert, ref yWert) ;
25 Console.WriteLine("xWert= {0},yWert={1}", xWert, yWert} ;
26 }}
C# - Programm: Aufbau von Methoden
Das Programm Punkt0l soll die Verwendung von ref in einem vollständigen Beispiel verdeutlichen.
Ausgabe:
Dr. Elfi Thiem Folie 28
Quellcode:
1 using System;
2
3 class RechtEck01
4 {
5 int nummer, laenge, breite, umfang,
flaeche;
6
7 static void Main()
8 {
9 RechtEck01 re1, re2;
10
11 re1 = new RechtEck01();
12 re2 = new RechtEck01();
13
14 re1.eingabe(1);
15 re1.b_flaeche();
16 re1.b_umfang();
17 re1.ausgabe();
18
19 re2.eingabe(2);
20 re2.b_flaeche();
21 re2.b_umfang();
22 re2.ausgabe();
23 }
24
C# - Programm: Instanzierung von Objekten
Bevor ein Objekt benutzt werden kann, muss es erzeugt
werden. Objekte werden mit dem new-Operator erstellt. Er
reserviert den Speicherplatz für das Objekt im Heap und
gibt einen Verweis zurück.
Syntax: datentyp verweis = new datentyp();
Falls der new-Operator keinen Speicher reservieren kann,
wird ein Fehler generiert.
Im folgenden Beispiel sollen Rechtecke als Objekte
angelegt, Umfang und Fläche berechnet und die Werte
ausgegeben werden.
Dazu wird beim Erzeugen eines Rechtecks eine Nummer an
den Konstruktor übergeben und in der Konstruktor-Methode
vom Anwender Breite und Länge erfragt. Durch Aufruf der
Methode ausgabe() werden die Methoden volumen() und
flaeche() gerufen und die Ergebnisse auf den Bildschirm
geschrieben.
Erläuterung: Zeile 5:
In der Klasse RechtEckO1 werden die Felder nummer,
laenge, breite, umfang und flaeche angelegt.
Zeile 9:
In der Methode Main () werden zwei Verweise re1 und re2
vom Typ RechtEckO1 angelegt.
Zeilen 11, 12:
Mit der Anweisung new werden zwei Objekte instanziert und
die Verweise auf sie in den Variablen re1 und re2
gespeichert.
Dr. Elfi Thiem Folie 29
25
26 void eingabe(int nr)
27 {
28 nummer = nr;
29 Console.Write("Rechteck: " + nr + "\n" +
30 "Bitte Länge eingeben: ");
31 laenge = Int32.Parse(Console.ReadLine());
32 Console.Write("Bitte Breite eingeben: ");
33 breite = Int32.Parse(Console.ReadLine());
34 }
35
36 void ausgabe()
37 {
38 Console.WriteLine("Die Fläche ist: {0,9}\n"+
39 "Der Umfang ist:{1,9}\n",flaeche,umfang);
40 }
41
42 void b_flaeche()
43 {
44 flaeche=laenge*breite;
45 }
46
47 void b_umfang()
48 {umfang=2*laenge+2*breite;
49 }}
C# - Programm: Instanzierung von Objekten
Zeilen 14-17:
Für das erste Rechteck, d.h. das Objekt re1, werden
mit der Methode eingabe (Zeilen 26-34) Länge und
Breite von der Tastatur eingelesen. Danach werden die
Fläche des Rechtecks (Zeilen 42-45) und der Umfang
(Zeilen 47-50) berechnet und mit der Methode
ausgäbe (Zeilen 36-40) am Bildschirm ausgegeben.
Zeilen 19-22:
Für das zweite Rechteck, d. h. das Objekt re2,
werden analog zum Rechteck1 wie in den Zeilen 14-17
beschrieben, die gleichen Tätigkeiten durchgeführt.
Zeilen 26-34:
Die Methode eingabe liest Länge und Breite von der
Tastatur ein und speichert die Werte in den Feldern
laenge und breite ab.
Zeilen 36-40:
Die Methode ausgabe gibt den Inhalt der Felder
flaeche und umfang am Bildschirm aus.
Zeilen 42-45:
Die Methode b_flaeche berechnet die Fläche mit den
Werten der Felder laenge und breite und speichert das
Ergebnis im Feld flaeche ab.
Zeilen 47-49:
Die Methode b_umfang arbeitet analog zur Methode
b_flaeche und berechnet den Umfang.
Dr. Elfi Thiem Folie 30
Ein Konstruktor ist eine Methode, die automatisch aufgerufen wird, wenn ein Objekt erstellt wird. Er wird oft verwendet,
um das Objekt zu initialisieren.
C# - Programm: Konstruktor und Destruktor
Syntax:
modifier klassenname (parameter liste )
{
// Programmcode des Konstruktors
}
Ein Destruktor ist eine Methode einer Klasse, die zum Zerstören eines Klassenobjekts erforderlich ist. Ein Destruktor
wird mit Hilfe einer Destruktor-Definition angelegt.
Die meisten Klassen benötigen keinen Destruktor, da die Abschlussarbeit lediglich in der Freigabe nicht mehr benö-
tigter Objekte besteht, was der Garbage Collector automatisch durchführt.
Syntax:
~klassenname {
// Programmcode des Destruktors
}
Dr. Elfi Thiem Folie 31
Quellcode: Bruch11.cs
1 using System;
2
3 class Bruch11
4 {
5 int zaehler, nenner;
6
7 static void Main()
8 {
9 Bruch11 bb1 = new Bruch11(3,5);
10 Bruch11 bb2 = new Bruch11(7,11);
11 Bruch11 bb3;
12
13 bb1.ausgabe();
14 bb2.ausgabe();
15 bb3=bb1.mult(bb2);
16 bb3.ausgabe();
17 }
18
19 Bruch11(int z,int n)
20 {
21 zaehler = z; nenner = n;
22 }
23
24 Bruch11 mult(Bruch11 b)
25 {
26 return(new Bruch11(zaehler*b.zaehler,nenner*b.nenner));
27 }
28
29 void ausgabe()
30 {
31 Console.WriteLine(zaehler + "/" + nenner);
32 }
33 }
C# - Programm: Konstruktor und Destruktor
Zeile 5:
Es werden zwei Felder für Zähler und Nenner angelegt.
Zeilen 7-17:
In der Methode Main werden die Objekte bb1 und bb2
erzeugt und über den Konstruktor (Zeilen 19-22) initiali-
siert. Zur Kontrolle werden die erzeugten Objekte durch
die Methode ausgabe (Zeilen 13, 14) auf dem Bildschirm
ausgegeben. Dann werden die beiden Brüche durch die
Methode mult (Zeile 15) multipliziert, das Ergebnis dem
Objekt bb3 zugewiesen und am Bildschirm ausgegeben (Zeile 16).
Zeilen 19-22:
Der Konstruktor erhält als Parameter Zähler und Nenner
und weist die Werte den Feldern zaehler und nenner zu.
Zeilen24-27:
Die Methode mult erhält als Parameter ein Objekt b (d.h.
einen Bruch). Dann werden Zähler und Nenner des Ob-
jekts b mit Zähler und Nenner des aktuellen Objekts (also
dem Objekt, mit dem d. Methode gerufen wurde) mul-
tipliziert. Mit new wird ein neues Objekt erzeugt, in wel-
chem das Ergebnis der Berechnung über den Konstruk-
tor abgelegt wird. Dieses Objekt wird nun über return an
die aufrufende Methode übergeben.
Zeilen 29-32:
Zähler und Nenner, genauer die Felder zaehler und
nenner, werden am Bildschirm ausgegeben.
Ausgabe:
3/5
7/11
21/55
Erläuterung:
Dr. Elfi Thiem Folie 32
C# - Programm: Vererbung und Schnittstellen
Wenn eine Klasse die Komponenten einer anderen Klasse erbt, dann nennt man letztere die
Basisklasse.
Klasse1 ist Basisklasse von Klasse2, d.h. Klasse2 erbt die Komponenten von Klasse1. Klasse2 nennt
man abgeleitete Klasse.
Vererbung ist transitiv, d. h. wenn eine Klasse3 von Klasse2 erbt und diese wiederum von Klasse1,
dann erbt Klasse3 auch alle Komponenten von Klasse1.
In einer Klassenhierarchie, also dem Aufbau von Basisklassen und abgeleiteten Klassen, können alle Klassen über eigene Konstruktoren verfügen.
Der Konstruktor der Basisklasse erzeugt den Objektanteil der Basisklasse, der Konstruktor der
abgeleiteten Klasse erzeugt den Objektanteil der abgeleiteten Klasse. Die Basisklasse besitzt keine Informationen über die abgeleitete Klasse. Sie wird daher gesondert eingerichtet. Damit liegt die Reihenfolge beim Aufruf fest.
Syntax:
class Klassenname1
{// Komponenten von Klasse1}
class Klassenname2 : Klassenname1
{// Komponenten von Klasse2}
Dr. Elfi Thiem Folie 33
Quellcode: Kind00.cs
Projekt öffnen: bsp\Visual Studio Projects\Kind00\Kind00.csproj
1 using System;
2
3 class ElternKlasse
4 {
5 public ElternKlasse()
6 {
7 Console.WriteLine("Eltern Konstruktor");
8 }
9 public void drucken()
10 {
11 Console.WriteLine("Hier: Eltern Klasse");
12 }
13 }
14
15 class Kind00 : ElternKlasse
16 {
17 public Kind00()
18 {
19 Console.WriteLine("Kind Konstruktor");
20 }
21
22 static void Main(string [] args)
23 {
24 Kind00 kind = new Kind00();
25 kind.drucken();
26 }
27 }
C# - Programm: Vererbung und Schnittstellen
Zeilen 3-13:
Definieren die Basisklasse, die vererbt wird.
Zeilen 5-8:
Der Konstruktor gibt zur Kontrolle den Text „Eltern
Konstruktor" aus.
Zeilen 10-11:
Eine Methode drucken wird definiert, die den Text
„Hier: Eltern Klasse" auf den Bildschirm schreibt.
Zeilen 15-26:
Definiert die Klasse Kind00, die von der Basisklasse
Elternklasse erbt.
Zeilen 17-20:
Der Konstruktor dieser Klasse gibt zur Kontrolle den
Text „Kind Konstruktor" aus.
Zeilen 22-26:
Die Methode Main initialisiert das Objekt kind.
Die Ausgabe zeigt, dass zuerst der Konstruktor der
Basisklasse und dann der Konstruktor der Klasse
aufgerufen wird. Im Anschluss wird die Methode
drucken gerufen.
Ausgabe:
Erläuterung:
Dr. Elfi Thiem Folie 34
Anlegen eines Projektes mit Studio.Net
(Windows-Anwendung)
Menü: Datei Neu Projekt
Projekttyp: Visual C# - Projekte und Vorlagen: Windows-Anwendung auswählen
Speicherort und Name festlegen.
Gegebenenfalls vorher einen Ordner anlegen.
Dr. Elfi Thiem Folie 35
Windows-Anwendung: C#-Programm – erste Demoanwendung
1. Aus dem Werzeugkasten
Toolbox die Schaltfläche
button mit der Maus auf das
leere Formular ziehen.
2. Schaltfläche eine Aktion
zuordnen:
Doppelklick auf den Button1,
Darauf erfolgt das Umschalten
in den Texteditor und das
Setzen der Textmarke an die
Einfügeposition.
1. Beispiel:
Dr. Elfi Thiem Folie 36
Windows-Anwendung: C#-Programm – erste Demoanwendung
3. Die Einfügeposition befindet
sich in der Methode
button1_Click(……).
Die Methode button1_Click ()
wird mit dem Programmcode
für eine MessageBox ergänzt.
4. Nach der Kompilierung und
Ausführung erhält man das auf
der linken Seite aufgeführte
Ergebnis.
Projekt öffnen: bsp\Visual Studio Projects\WindowsApplication1\WindowsApplication1.csproj
Dr. Elfi Thiem Folie 37
Quellcode: HelloCsharp9.cs
1 using System;
2 using System.Windows.Forms;
3 using System.Drawing;
4
5 public class HelloCsharp9 : Form
6 {
7 public static void Main()
8 {
9 Application.Run(new HelloCsharp9()); 10 } 11
12 public HelloCsharp9 () 113 { 14 this.Text = "Hallo, viel Spass mit C#!"; 15 } 16 17 protected override
18 void OnPaint(PaintEventArgs p) 19 { 20 p.Graphics.FillRectangle(
21 new SolidBrush(Color.Blue),this.ClientRectangle); 22 Font f =
new Font("Helvetica",24.0F,GraphicsUnit.Point); 23 p.Graphics.DrawString("Hallo,", f,
24 new SolidBrush(Color.Yellow), 20.0F,40.0F); 25 p.Graphics.DrawString("viel Spass",f,
26 new SolidBrush(Color.Red),70.0F,100.0F); 27 p.Graphics.DrawString ("mit C# .' ", f,
28 new SolidBrush(Color.Cyan) , 160.0F, 160.0F) ; 29 }}
Windows-Anwendung: C# - Programm - Fenster
Nachfolgend wird ein einfaches Beispiel
aufgeführt, das die Ausgabe “Hallo, viel
Spaß mit C#!“ in einem eigen Fenster
und bunt am Bildschirm darstellt.
Gehen Sie dabei wie folgt vor:
Projekt anlegen Doppelklick auf
leeres Formular Codegerüst löschen
Nebenstehenden Code einfügen.
2. Beispiel:
Dr. Elfi Thiem Folie 38
Windows-Anwendung: C#-Programm - Timer
1. Fügen Sie ein
Beschriftungsfeld Label
als Platzhalter für den
Timer ein.
2. Stellen Sie eine ge-
wünschte Schriftgröße im
Eigenschaftsfeld Label1
ein.
3. Ziehen Sie nun den Timer
in die Anwendung.
4. Stellen Sie im Eigen-
schaftsfeld des Timers
True und 300 ein.
Projekt öffnen: bsp\Visual Studio Projects\Timer\Timer.csproj
3. Beispiel:
Dr. Elfi Thiem Folie 39
Windows-Anwendung: C#-Programm - Timer
5. Kompilieren und Starten Sie das
Programm!
4. Fügen Sie in der Methode für den
Timer1 den nachfolgenden
Quelltext ein.
Dr. Elfi Thiem Folie 40
Windows-Anwendung: C#-P rogramm – Berechnung der Mehrwertsteuer
Das Programm soll Funktionalität besitzen:
1. Eingabe des Bruttobetrages
2. Durch einen Klick auf den Button
“Berechnen…“ erfolgt die Berechnung
des Nettobetrages und der Steuer bei
gleichzeitiger Ausgabe in die
entsprechenden Felder.
Durchführung:
1. Ziehen Sie die entsprechenden Textlabel
in das Formular. Im Eigenschaftsfeld än-
dern Sie das Attribut Text entsprechend.
2. Ziehen Sie drei Textblöcke in das
Formular.
Im Eigenschaftsfeld löschen Sie den Text
“TextBox“ beim Attribut Text .
3. Ziehen Sie zwei Button auf das Formular
und ändern Sie die Beschriftung der
Button über das Eigenschaftsfeld.
Projekt öffnen: bsp\Visual Studio Projects\msteuer-csh\msteuer-csh.csproj
4. Beispiel:
Dr. Elfi Thiem Folie 41
Windows-Anwendung: C#-Programm – Berechnung
der Mehrwertsteuer
Durchführung:
4. Fügen Sie im Codegerüst in der
Klasse Form1 zusätzliche Variablen
ein: double brutto, netto, steuer.
5. Durch Doppelklick auf die Button
fügen sie die entsprechenden
Methodengerüste im Hauptpro-
gramm Main() hinzu.
6. Schreiben Sie die entsprechenden
Anweisungen für die Funktionalität
des Formulars in die Methoden
button2_Click() und button1_Click().