Methoden - Microsoft

Werbung
Datei: 08.doc, Seite115
31. Oktober 2006
Kapitel 8
Methoden
„
was eine Methode ist und wofür Sie sie benötigen
„
wie Sie eine Methode aufrufen
„
wie Sie eigene Methoden erstellen
„
wie Sie Methoden aus bestehendem Code extrahieren
„
was Methodenstubs sind
„
wie Sie Methoden überladen
8.1 Wozu werden Methoden benötigt?
Der Begriff Methode ist Ihnen in diesem Buch schon häufig begegnet. Bereits im ersten Beispiel in Kapitel 3 haben wir Sie mit den Methoden Main und WriteLine konfrontiert und Ihnen auf einer knappen Seite
die wichtigsten Informationen rund um Methoden geliefert. Dieser Vorgriff war gewissermaßen »aus
der Not geboren«, denn ohne Methoden können Sie in C# kein Programm erstellen. Auch in den Klassen, die wir in Kapitel 11 noch ausführlich vorstellen, sind immer Methoden enthalten.
Gut, jetzt wissen Sie, dass in C# ohne Methoden nichts geht. Aber die Frage nach der dahinter stehenden
Idee ist damit noch nicht geklärt. Die Antwort auf diese Frage hängt letztendlich mit der Arbeitsweise
des menschlichen Gehirns zusammen: Da das Gehirn schlicht und einfach nicht in der Lage ist, alle
Abläufe eines Programms im Detail zu erfassen, ist ein Programmierer gezwungen, komplexe Probleme
in viele kleine Teilaufgaben zu zerlegen. Von diesen Aufgaben muss er nicht immer wissen, wie sie im
Detail gelöst werden können, sondern er kann auf bestehende Lösungen zurückgreifen. Eine solche
Teilaufgabe erledigt zum Beispiel die Methode WriteLine. Die scheinbar simple Anweisung, etwas auf
dem Bildschirm auszugeben, ist technisch gesehen eine komplizierte Aufgabe, die einiges an Spezialwissen erfordert. Wenn sich jeder Programmierer mit diesem Wissen »belasten« müsste, wären moderne
Programme absolut undenkbar.
Methoden erstellen heißt also, ein Problem in sinnvolle Teilaufgaben zu zerlegen, die jede für sich betrachtet möglichst autark und überschaubar ist. Besonders bei Aufgaben, die in einem Programm mehrfach durchgeführt werden müssen, bietet sich das Erstellen einer Methode an. Der Code wird übersichtlicher und wartungsfreundlicher, da es im Idealfall keinen doppelten Code mehr gibt.
Visual C# 2005 Express Edition unterstützt dieses Konzept, indem es das Arbeiten mit Methoden sehr
komfortabel macht. Mit IntelliSense haben Sie bereits eine dieser Funktionen kennengelernt, andere wie
Methodenstubs und das Extrahieren von Methoden werden wir Ihnen im weiteren Verlauf des Kapitels
noch vorstellen.
115
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
III – Konzepte der OOP
In diesem Kapitel lernen Sie
Datei: 08.doc, Seite116
31. Oktober 2006
Kapitel 8
Methoden
8.2 Eigene Methoden erstellen
Damit wir die Praxis nicht aus den Augen verlieren, wollen wir Ihnen zunächst ein kurzes Beispiel vorstellen, bevor wir gleich näher auf die Syntax von Methoden eingehen. In einigen der bisherigen Beispielprogramme sollte der Anwender eine Zahl eingeben, die dann auf verschiedene Art und Weise
weiterverarbeitet wurde. Dazu mussten die Programme jeweils mehrere Aufgaben erledigen:
„
Anzeigen einer Eingabeaufforderung
„
Einlesen der Eingabe des Anwenders
„
Umwandeln der Eingabe in einen Integerwert
In Programmen, die die Eingabe von zwei Zahlen erforderten, haben wir den entsprechenden Code
sogar doppelt eingegeben (z. B. bei unserem Minirechner aus Kapitel 6). Hier drängt sich die Erstellung
einer Methode geradezu auf.
Bevor Sie eine neue Methode anlegen, müssen Sie sich zunächst genau überlegen, welches Ergebnis die
Methode erzielen soll und welche Informationen sie zu diesem Zweck benötigt. In unserem Fall liegt die
Sache recht einfach:
„
Die Methode soll zuerst eine Eingabeaufforderung anzeigen. Der dazu benötigte Text wird ihr beim
Aufruf übergeben.
„
Anschließend soll sie die Eingabe des Anwenders entgegennehmen.
„
Im nächsten Schritt soll die Eingabe in einen Integerwert umgewandelt werden. Wenn diese Umwandlung fehlschlägt, soll die Methode so tun, als ob der Anwender eine Null (0) eingegeben hat.
„
Als letzte Aktion soll die Methode die eingegebene Zahl zurückgeben.
Nach diesen gedanklichen Vorarbeiten können wir mit der praktischen Umsetzung beginnen:
1. Erstellen Sie ein Projekt vom Typ Konsolenanwendung und geben Sie ihm den Namen Methoden.
2. Tippen Sie unterhalb der main-Methode folgenden Code ein:
private static int LeseZahl(string s)
{
}
Sie haben jetzt eine leere Methode mit dem Namen LeseZahl erstellt, die einen Parameter vom Typ
String erwartet und als Ergebnis einen int-Wert liefert.
3. Fügen Sie nun innerhalb der geschweiften Klammern den eigentlichen Programmcode der neuen
Methode ein:
private static int LeseZahl(string s)
{
string eingabe;
int ret;
// Diese Variablen werden innerhalb der Methode benötigt
Console.Write(s);
eingabe = Console.ReadLine();
// Eingabeaufforderung anzeigen
// Eingabe entgegennehmen
try
{
ret = int.Parse(eingabe);
}
// Eingabe in einen int-Wert umwandeln (mit Fehlerbehandlung)
116
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite117
31. Oktober 2006
8.2 Eigene Methoden erstellen
catch (FormatException)
{
ret = 0;
}
return ret;
// Ergebnis der Methode zurückliefern
}
Da Sie den Code bereits aus den letzten Kapiteln kennen, verzichten wir an dieser Stelle auf eine
nähere Erläuterung. Damit ist die Erstellung der Methode abgeschlossen und die Methode steht für
ihren ersten Einsatz bereit.
4. Fügen Sie nun in die main-Methode die folgenden Codezeilen ein. Nutzen Sie die IntelliSense-
Funktion, um den Namen der Methode einzugeben (siehe nächstes Bild):
int i, j;
i = LeseZahl("Bitte geben Sie die erste Zahl ein: ");
j = LeseZahl("Bitte geben Sie die zweite Zahl ein: ");
III – Konzepte der OOP
Console.WriteLine("Die größere Zahl ist: {0}", i > j ? i : j);
Abbildung 8.1: IntelliSense hat die neue Methode sofort erkannt und bietet sie in der Auswahlliste an.
Sehen Sie, wie aufgeräumt und übersichtlich der Code der main-Methode geworden ist? Die Funktionsweise des Programms lässt sich auf einen Blick erkennen, da der Code dank der neuen Methode von »störenden« Detailproblemen befreit wurde.
5. Starten Sie das Programm mit Strg+F5 und prüfen Sie, ob es die erwarteten Ergebnisse liefert.
Den vollständigen Code finden Sie im Beispielprojekt Kap08\Methoden in dem Ordner, in den die Beispiele für dieses Buch installiert wurden.
Methoden dokumentieren
Wenn Sie sich das letzte Bild genau angesehen haben, ist Ihnen vielleicht aufgefallen, dass im Tooltipp
neben dem Methodennamen lediglich der Rückgabetyp und eine Liste der Parameter enthalten sind.
Üblicherweise finden Sie in den Tooltipps der IntelliSense-Funktion aber zusätzlich noch eine kurze
Beschreibung des ausgewählten Elements. Diesen Komfort können Sie mit minimalem Aufwand auch
für Ihre selbst erstellten Methoden bereitstellen. Und wie Sie gleich sehen werden, übernimmt die IDE
einen Großteil der Tipparbeit für Sie:
117
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite118
31. Oktober 2006
Kapitel 8
Methoden
1. Setzen Sie die Einfügemarke über die Zeile
private static int LeseZahl(string s)
2. Geben Sie dort drei Schrägstriche ein, also ///. Sobald Sie den dritten Schrägstrich eingetippt haben,
fügt die IDE automatisch diese Zeilen ein:
///
///
///
///
///
<summary>
</summary>
<param name="s"></param>
<returns></returns>
Dies ist das Grundgerüst für die Methodenbeschreibung, wie sie normalerweise in den Tooltipps
angezeigt wird. Wir wollen an dieser Stelle nicht weiter auf die technischen Hintergründe dieser
Anweisungen eingehen, sondern lediglich zeigen, wie solche Kommentare erstellt werden. In Kapitel 11 werden wir noch einmal ausführlich auf dieses Thema zurückkommen.
3. Ergänzen Sie die neuen Zeilen wie folgt:
///
///
///
///
///
<summary>
Zeigt eine Eingabeaufforderung an und liest eine Ganzzahl ein.
</summary>
<param name="s">Eingabeaufforderung</param>
<returns>Die eingelesene Ganzzahl oder 0, wenn keine Zahl eingegeben wurde.
</returns>
4. Geben Sie in der main-Methode den Anfang der Anweisung i = LeseZahl("Ihre Eingabe: "); ein und
achten Sie dabei auf den Tooltipp der IntelliSense-Funktion.
Abbildung 8.2: IntelliSense zeigt jetzt auch die Beschreibung der Methode an.
5. Vervollständigen Sie die Anweisung und achten Sie diesmal auf den Tooltipp, der nach dem Ein-
tippen der runden Klammer erscheint:
Abbildung 8.3: Auch die Parameterbeschreibung wurde von IntelliSense erkannt.
Nutzen Sie dieses Feature in Ihren eigenen Methoden unbedingt. Das (zugegeben lästige) Kommentieren und Dokumentieren von Programmcode war wirklich noch nie so einfach wie mit dieser Entwicklungsumgebung!
118
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite119
31. Oktober 2006
8.3 Die allgemeine Syntax von Methoden
8.3 Die allgemeine Syntax von Methoden
Nach diesem Ausflug in die Praxis wollen wir uns nun die Syntax einer Methode näher ansehen, die
ganz allgemein so aussieht (die erste Zeile wird übrigens als Methodensignatur bezeichnet):
Zugriffsmodifizierer Rückgabetyp Methodenname(Parameterliste)
{
// Methodenkörper (Anweisungen der Methode)
}
Wenn man dieser Syntax die Definition der Methode LeseZahl() gegenüberstellt, lassen sich die verschiedenen Elemente leicht zuordnen:
private static int LeseZahl(string s)
{
string eingabe;
...
return ret;
}
Zugriffsmodifizierer
Mit dem Zugriffsmodifizierer können Sie festlegen, von wo aus eine Methode aufgerufen werden kann:
„
Methoden, die als private gekennzeichnet sind, können nur innerhalb ihrer eigenen Klasse aufgerufen werden und sind außerhalb ihrer Klasse sozusagen »unsichtbar«. Dies ist gleichzeitig der Standardzugriffsmodus, d. h. wenn eine Methodendefinition keinen Zugriffsmodifizierer enthält, ist die
Methode private. Sie sollten allerdings nicht mit diesem Automatismus arbeiten, sondern immer
explizit angeben, wie auf die Methode zugegriffen werden kann.
„
Methoden, die als public gekennzeichnet sind, lassen sich aus allen anderen Klassen aufrufen.
„
Der Zugriffsmodifizierer internal legt fest, dass die Methode innerhalb der gesamten Assembly, also
des aktuellen Programms, aufgerufen werden kann.
„
Der vierte Modifizierer nennt sich protected und wird im Zusammenhang mit Vererbung eingesetzt. Er bestimmt, dass eine Methode nicht nur aus ihrer eigenen Klasse, sondern auch aus den von
ihr abgeleiteten Klassen aufgerufen werden kann.
Der Zugriffsmodifizierer kann zusätzlich noch mit dem Schlüsselwort static kombiniert werden. Statische Methoden sind nicht an die Existenz eines Objekts gebunden und können direkt aufgerufen werden. Einige bekannte statische Methoden, die Sie in den Beispielen dieses Buches schon häufig eingesetzt
haben, sind Write(), WriteLine(), Read() und ReadLine(). Wenn Sie zum Beispiel folgenden Methode
definieren:
public static double Kreisfläche(double radius)
{
return radius * radius * Math.PI;
}
können Sie sie anschließend aus einer beliebigen Klasse (da public) mit folgender Anweisung aufrufen:
fläche = Kreisfläche(radius);
119
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
III – Konzepte der OOP
In den folgenden Abschnitten gehen wir nun im Detail auf die einzelnen Bestandteile einer Methode ein.
Datei: 08.doc, Seite120
31. Oktober 2006
Kapitel 8
Methoden
Erstellen Sie hingegen eine Methode ohne das Schlüsselwort static, müssen Sie für den Zugriff auf die
Methode erst ein Objekt der Klasse erstellen, in der sich die Methode befindet, und können dann über
diese Objektvariable auf die Methode zugreifen:
Klassenname objVariable = new Klassenname();
double radius;
double umfang;
...
umfang = objVariable.Kreisumfang(radius);
// Objektvariable der Klasse "Klassenname" erzeugen
In diesem Kapitel ist das Schlüsselwort static jedoch nicht mehr als eine Randerscheinung, die wir nur
der Vollständigkeit halber erwähnt haben. In Kapitel 11, wenn wir uns mit dem Thema Klassen beschäftigen, werden wir auf diese Zusammenhänge noch näher eingehen.
Rückgabewert
In den meisten Fällen soll eine Methode dem aufrufenden Code ein Ergebnis liefern. Dieses Ergebnis
wird als Rückgabewert bezeichnet und muss immer den bei der Methodendefinition festgelegten Datentyp besitzen. (Die Syntax einer Methodendefinition finden Sie auf Seite 119.) Soll eine Methode keinen
Rückgabewert besitzen, wird dies durch das Schlüsselwort void kenntlich gemacht, das Ihnen bereits in
einigen der letzten Beispiele begegnet ist.
Damit der Rückgabewert den aufrufenden Code erreicht, muss innerhalb der Methode eine returnAnweisung ausgeführt werden, die den gewünschten Datentyp liefert. Die folgende Funktion lässt sich
zum Beispiel nicht kompilieren, da der Rückgabewert der Methode den Datentyp string besitzt, die
return-Anweisung jedoch ein int liefert:
Abbildung 8.4: Die return-Anweisung liefert den falschen Datentyp.
Die return-Anweisung beendet automatisch die Ausführung einer Methode. Alle Anweisungen, die
hinter einer return-Anweisung stehen, werden daher nicht ausgeführt und lösen beim Kompilieren die
Warnung Unerreichbarer Code wurde entdeckt! aus:
private int GetMinimum(int ErsteZahl, int ZweiteZahl)
{
return (ErsteZahl <= ZweiteZahl) ? ErsteZahl : ZweiteZahl;
Console.WriteLine("Aufruf von GetMinium() erfolgreich!");
}
// Diese Zeile kann nie erreicht werden
Diese Einschränkung gilt natürlich nicht für Anweisungen, die zwar unterhalb der aktuellen returnAnweisung stehen, sich aber in einem Anweisungsblock befinden, zu dem die Programmausführung
ohnehin nicht mehr gelangen könnte. Die folgende Methode ist also aus Sicht des Compilers völlig
korrekt:
120
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite121
31. Oktober 2006
8.3 Die allgemeine Syntax von Methoden
private double GetMinimum(double ErsteZahl, double ZweiteZahl)
{
if (ErsteZahl <= ZweiteZahl)
{
return ErsteZahl;
}
else
{
return ZweiteZahl;
}
}
Methodenname
Auch wenn zwei Methoden eine ähnliche Aufgabe erfüllen, sollte dies an ihren Namen zu erkennen sein.
Wenn Sie zum Beispiel zusätzlich zur Methode LeseZahl() noch eine weitere Methode schreiben würden, die den Anwender auffordert, einen Text einzugeben, sollten Sie ihr einen Namen wie LeseString()
oder LeseZeichenkette() geben; Namen wie ZeichenketteHolen() oder GetString() wären hingegen eher
ungeeignet, da sie durch die andere Wortwahl auch eine andere Funktionsweise implizieren. In umfangreichen Projekten sind durchdachte Namen für Variablen und Methoden von unschätzbarem Wert. Sie
tragen entscheidend dazu bei, dass der Programmcode wartbar bleibt. (Wer jemals ein altes FortranProgramm gesehen hat, in denen Variablennamen selten länger als vier Buchstaben sind und ihr Anfangsbuchstabe gleichzeitig über ihren Datentyp entscheidet, weiß, wovon wir sprechen.)
Parameter
Parameter dienen dazu, einer Methode bei ihrem Aufruf Informationen bzw. Daten zu übergeben. Dazu
muss in der Methodendefinition innerhalb der runden Klammern für jeden Parameter dessen Datentyp
und sein Name angegeben werden. Bei mehreren Parametern werden die Angaben durch Kommata
voneinander getrennt. Soll die Methode keinen Parameter erhalten, bleiben die runden Klammern leer.
Im Methodenkörper können Sie über die Parameternamen auf die übergebenen Daten zugreifen. Dazu
ist es in der Regel sinnvoll, den Parametern aussagekräftige Namen zu geben. Die Verwendung eines
einzelnen Buchstabens, wie im obigen Beispiel, ist zwar durchaus üblich, eignet sich aber nur für kurze,
überschaubare Methoden. Bedenken Sie auch, dass der Parametername im Tooltipp der IntelliSenseFunktion angezeigt wird (siehe Bild 8.1) und auch hier wertvolle Dienste leisten kann.
Beim Aufruf der Methode müssen die Anzahl, die Reihenfolge und die Datentypen der Parameter zwingend eingehalten werden. Es ist auch nicht wie in einigen anderen Sprachen erlaubt, einzelne Parameter
auszulassen. Dass C# an dieser Stelle so restriktiv ist, hängt mit dem Konzept der Überladung von Methoden zusammen, auf das wir weiter unten noch zu sprechen kommen.
121
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
III – Konzepte der OOP
Für den Namen einer Methode gelten die gleichen formalen Regeln wie für Variablen, die wir Ihnen im
vierten Kapitel vorgestellt haben. Dort haben wir auch erwähnt, dass die Entwurfsrichtlinien für das
.NET Framework vorsehen, dass Namen von öffentlichen Methoden mit einem Großbuchstaben
:beginnen (Pascal-Schreibweise). Darüber hinaus sollten Sie bei der Namensgebung darauf achten, dass
der Name einer Methode einen deutlichen Hinweis auf ihre Funktionalität liefert.
Datei: 08.doc, Seite122
31. Oktober 2006
Kapitel 8
Methoden
Eine wichtige Frage, die es noch im Zusammenhang mit Parametern zu klären gilt, ist die folgende: Was
passiert eigentlich, wenn eine Methode einen Parameter verändert? Betrifft diese Änderung das aufrufende Programm oder nicht? Nun, probieren Sie es doch einfach mal aus:
1. Erstellen Sie ein neues Projekt und geben Sie ihm den Namen Parameter.
2. Schreiben Sie eine Methode Quadrat, die einen int-Wert als Parameter erwartet und sein Quadrat
als Ergebnis liefert. Beachten Sie, dass der Parameter zahl innerhalb der Methode geändert wird:
private static int Quadrat(int zahl)
{
zahl *= zahl;
return zahl;
}
3. Fügen Sie in die main-Methode folgende Anweisungen ein.
int z = 2;
Console.WriteLine("{0} ist die Quadratzahl von {1}.", Quadrat(z), z);
4. Starten Sie das Programm mit Strg+F5 und sehen Sie sich die Ausgabe des Programms an.
Das Ergebnis der WriteLine-Methode lautet 4 ist die Quadratzahl von 2. Wie Sie sehen, hat die Veränderung des Parameters zahl innerhalb der Methode Quadrat keinen Einfluss auf die Variable z der mainMethode, die wir für die Parameterübergabe verwendet haben. Parameter werden in C# nämlich als
Wert übergeben, d. h. die Methode erhält eine Kopie der Variable z. Alle Änderungen an der methodeninternen Variablen haben dadurch keinen Einfluss auf das Original.
Mit dieser Information im Hinterkopf starten wir nun unseren nächsten Versuch:
1. Erstellen Sie ein neues Projekt und geben Sie ihm den Namen VorsichtFalle.
2. Schreiben Sie wieder eine Methode Quadrat, die diesmal eine Array-Variable als Parameter erwar-
tet. Das übergebene Array soll mit Quadratzahlen gefüllt werden. Als Ergebnis soll die Methode einen String mit allen Quadratzahlen liefern:
private static string Quadrat(int[] zahlen)
{
string quadratzahlen = "";
// nimmt den Rückgabewert auf
for (int i = 0; i < zahlen.Length; i++)
// Array mit Quadratzahlen füllen
{
zahlen[i] = (i+1) * (i+1);
quadratzahlen = quadratzahlen + zahlen[i] + " ";
}
return quadratzahlen;
}
3. Erweitern Sie die main-Methode mit den im folgenden Listing fett gedruckten Anweisungen.
static void Main(string[] args)
{
// lokales Array definieren
int[] leeresArray = new int[10];
// Methode aufrufen und lokales Array übergeben
Console.WriteLine("Rückgabe der Methode: {0}", Quadrat(leeresArray));
122
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite123
31. Oktober 2006
8.3 Die allgemeine Syntax von Methoden
// Inhalt des lokalen Arrays anzeigen
Console.WriteLine("\nInhalt des lokalen Arrays:");
foreach (int i in leeresArray)
Console.Write("{0} ", i);
Console.WriteLine();
}
Mit diesem Code wird zunächst ein Array aus zehn int-Werten definiert, das durch die automatische Initialisierung anschließend vollständig mit Nullen (0) gefüllt ist. Dieses Array wird dann der
Methode Quadrat übergeben, die als Ergebnis eine Zeichenkette mit den ersten zehn Quadratzahlen liefern müsste. Zum Schluss wird noch geprüft, ob das lokale Array durch den Aufruf der Methode wirklich nicht verändert wurde.
III – Konzepte der OOP
4. Starten Sie das Programm mit Strg+F5 und sehen Sie sich seine Ausgabe an.
Abbildung 8.5: Die Methode Quadrat hat das lokale Array verändert!
Hoppla, irgendwie hat es die Methode doch geschafft, das Array zu verändern. Dabei hatten wir doch
gesagt, dass Methodenparameter eine Kopie der übergebenen Daten erhalten und das Original daher
nicht verändern können. Haben Sie eine Idee, wo wir Sie in diesem Beispiel aufs Glatteis geführt haben?
Des Rätsels Lösung ist eigentlich gar nicht so kompliziert: In unserem ersten Beispiel hat die Methode
Quadrat über die Variable zahl einen int-Wert als Parameter erhalten. Bei diesem Datentyp handelt es
sich um einen Werttyp. Eine Kopie der Variable enthält daher den gleichen Wert wie die Variable selbst.
Ganz anders verhält es sich im zweiten Beispiel. Der Parameter der Methode ist diesmal ein Array, also
ein Verweistyp! Die Methode erhält zwar tatsächlich eine Kopie der Variablen leeresArray, aber dabei
handelt es sich ja nur um den Verweis auf den Speicherbereich der Array-Elemente und nicht um die
Elemente selbst. Die Methode arbeitet also mit einem kopierten Verweis, der exakt auf den gleichen
Speicherbereich verweist wie sein Original.
Sie sehen also, wie wichtig es ist, dass Sie den Unterschied zwischen Wert- und Verweistypen kennen
und beachten.
123
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite124
31. Oktober 2006
Kapitel 8
Methoden
Besonderheiten bei string-Variablen
Obwohl der Datentyp string ein Verweistyp ist, verhält sich eine string-Variable, die Sie einer
Methode als Argument übergeben, wie ein Werttyp. Das heißt, wenn Sie innerhalb der Methode die String-Variable ändern, hat das keine Auswirkung auf die Variable im aufrufenden
Programmcode. Dieses auf den ersten Blick merkwürdige Verhalten hängt mit einer besonderen Eigenschaft von string-Variablen zusammen: Sie können ein string-Objekt nicht verändern! Jede Änderung einer string-Variable löst in Wirklichkeit die Erzeugung eines neuen
string-Objekts aus. Wenn Sie also in einer Methode ein string-Argument verändern, erzeugen
Sie unbemerkt ein neues string-Objekt, ohne dass dabei das string-Objekt des aufrufenden
Codes beeinflusst wird.
ref-Parameter
Sie können Parameter aber auch als Verweis an eine Methode übergeben. In diesem Fall kann die Methode direkt auf die Variable des aufrufenden Codes zugreifen. Dazu müssen Sie dem Parameter sowohl
in der Methodendefinition als auch beim Aufruf der Methode das Schlüsselwort ref voranstellen. Außerdem muss der entsprechenden Variablen vor dem Aufruf der Methode ein Wert zugewiesen werden:
static void Main(string[] args)
{
string s = "“;
Wochentag(ref s);
Console.WriteLine("Heute ist {0}", s);
}
private static void Wochentag(ref string wochentag)
{
wochentag = DateTime.Now.ToString("dddd“);
}
In diesem Beispiel wird die Variable s zunächst mit einer leeren Zeichenkette initialisiert. Anschließend
wird beim Aufruf der Methode Wochentag eine Referenz auf diese Variable übergeben. Dadurch verweisen nun die beiden Variablen s und wochentag auf das gleiche String-Objekt. Wenn dann innerhalb der
Methode eine Zuweisung an die Variable wochentag erfolgt, hat dies die gleiche Wirkung als ob die Zuweisung direkt im aufrufenden Code mit der Variablen s vorgenommen würde.
out-Parameter
Eine Methode kann normalerweise nur genau einen Rückgabewert liefern. Gelegentlich soll eine Methode aber auch mehrere Ergebnisse liefern können. Natürlich ließe sich das auch indirekt über refParameter lösen, da eine Methode auf diesem Weg ihre Ergebnisse direkt im aufrufenden Code ablegen
könnte. Und in der Tat geht C# auch genau diesen Weg. Allerdings wird in diesen Fällen anstelle des
Schlüsselwortes ref das Schlüsselwort out verwendet (für output).
Die Wirkungsweise von out ist mit der von ref bis auf zwei wichtige Ausnahmen identisch:
„
Die als Argument übergebenen Variablen müssen nicht initialisiert sein.
„
Die Methode muss(!) dem Parameter einen Wert zuweisen.
124
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite125
31. Oktober 2006
8.3 Die allgemeine Syntax von Methoden
Unter Verwendung eines out-Parameters sähe das letzte Beispielprogramm also folgendermaßen aus:
static void Main(string[] args)
{
string s;
Wochentag(out s);
Console.WriteLine("Heute ist {0}", s);
}
private static void Wochentag(out string wochentag)
{
wochentag = DateTime.Now.ToString("dddd“);
}
Die einzigen Änderungen sind demnach die fehlende Initialisierung der Variablen s und die Verwendung des Schlüsselwortes out anstelle von ref.
Es gibt gelegentlich Situationen, in denen sich für eine Methode die Anzahl der zur Laufzeit benötigten
Parameter nicht im Voraus festlegen lässt. Denken Sie zum Beispiel an die Methode WriteLine(), bei der
die Anzahl der Parameter von der Anzahl der verwendeten Platzhalter abhängt:
Console.WriteLine("H = {0}, B = {1}, T = {2}", höhe, breite, tiefe);
Für solche Fälle gibt es in C# das Schlüsselwort params, das einen Parameter in die Lage versetzt, beliebig
viele Argumente entgegenzunehmen. Allerdings darf dieses Schlüsselwort in einer Methodendefinition
nur ein einziges Mal verwendet werden, und es muss sich dabei um den letzten Parameter handeln.
Ein möglicher Anwendungsfall für params wäre zum Beispiel eine Methode, der Sie beliebig viele intWerte übergeben können, und die dann die größte dieser Zahlen zurückgibt. Die entsprechende Methodendefinition sähe dann etwa so aus:
public static int GrößterWert(int zahl1, int zahl2, params int[] zahlen)
{
// Code der die größte übergebene Zahl ermittelt
}
Der Methode müssen mindestens zwei Argumente übergeben werden (zahl1 und zahl2), denn ansonsten macht die Ermittlung des Maximums wenig Sinn. Wie Sie sehen, besitzt der dritte Parameter den
Datentyp int[], er ist also ein Array aus int-Werten. Bekanntlich können Arrays aber sowieso beliebig
viele Elemente enthalten, wozu ist also noch das Schlüsselwort params nötig? Nun, der wichtige Unterschied ist, dass der dritte Parameter durch die Verwendung von params optional wird. Das heißt, Sie
können ihm beim Aufruf der Methode wahlweise Argumente übergeben oder ihn vollständig ignorieren. Ein weiterer Unterschied ergibt sich beim Aufruf der Methoden, doch darauf kommen wir gleich
noch zurück.
Innerhalb der Methode können Sie mit der gewohnten Array-Syntax auf die optionalen Argumente
zugreifen. Für unser Beispiel bietet sich der Einsatz einer foreach-Schleife an:
public static int GrößterWert(int zahl1, int zahl2, params int[] zahlen)
{
int maximum;
125
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
III – Konzepte der OOP
params-Parameter
Datei: 08.doc, Seite126
31. Oktober 2006
Kapitel 8
Methoden
// zunächst die beiden ersten Parameter auswerten
maximum = zahl1 > zahl2 ? zahl1 : zahl2;
// jetzt alle Elemente des Parameterarrays prüfen
foreach (int i in zahlen)
if (i > maximum)
{
maximum = i;
}
return maximum;
}
Nachdem die Methode implementiert ist, stellt sich natürlich als nächstes die Frage, wie die Methode
aufgerufen wird. Müssen die optionalen Argumente als Array angegeben werden oder gibt es noch andere Varianten? Wenn Sie wieder an die Methode WriteLine() denken, kennen Sie zumindest schon einen
Teil der Antwort: Die optionalen Argumente werden im einfachsten Fall wie ganz normale Parameter
übergegeben:
Console.WriteLine(GrößterWert(1, 2, 3, 4, 5, 6, 7, 8, 9));
Und mit dieser Schreibweise haben Sie bereits den zweiten Vorteil von params gegenüber einem normalen Array kennengelernt. Einem Array-Parameter müssen Sie auch auf jeden Fall ein Array übergeben.
Die korrekte Schreibweise sähe dann zum Beispiel so aus:
int[] zahlen = {3, 4, 5, 6, 7, 8, 9};
Console.WriteLine(GrößterWert(1, 2, zahlen));
oder kürzer:
Console.WriteLine(GrößterWert(1, 2, new int[] {3, 4, 5, 6, 7, 8, 9}));
Das params Schlüsselwort macht Ihren Code also auch weniger umständlich und besser lesbar.
8.4 Refactoring Tools für Methoden
In diesem Abschnitt möchten wir Sie mit zwei weiteren bemerkenswerten Features der IDE aus der
Abteilung Komfort bekannt machen: den Methodenstubs und dem Extrahieren von Methoden. Beide
Funktionen beschleunigen das Erstellen von Methoden erheblich, entlasten Sie von lästiger Tipparbeit
und erhöhen so Ihre Produktivität.
Methodenstubs
Unter einem Methodenstub versteht man bei Visual C# 2005 Express Edition ein leeres Methodengerüst. Die dahinter stehende Idee geht von folgendem Szenario aus: Sie sind dabei, Code zu schreiben und
merken soeben, dass Sie für die nächste Teilaufgabe am besten eine neue Methode erstellen sollten.
Normalerweise würden Sie jetzt wahrscheinlich Ihren aktuellen Denkprozess unterbrechen und mit dem
Implementieren der benötigten Methode beginnen. Mit Methodenstubs vermeiden Sie diese störende
Ablenkung und können weiterhin konzentriert an Ihrem ursprünglichen Codeproblem arbeiten. Wie
das funktioniert? Probieren Sie es aus!
126
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite127
31. Oktober 2006
8.4 Refactoring Tools für Methoden
1. Erstellen Sie ein neues Projekt vom Typ Konsolenanwendung und geben Sie ihm den Namen
Stubs. Das Programm soll den Anwender zur Eingabe einer Ganzzahl auffordern und anschließend
deren Quersumme berechnen und anzeigen.
2. Fügen Sie in die Main-Methode zunächst die Deklaration zweier Variablen ein, die die Eingabe des
Anwenders und die daraus ermittelte Quersumme aufnehmen sollen.
l
o
n
ge
i
n
g
a
b
e
;
i
n
tq
u
e
r
s
u
m
m
e
;
3. Jetzt müssten Sie den Code schreiben, mit dem Sie eine Eingabeaufforderung anzeigen und die
Eingabe des Anwenders entgegennehmen können. Stattdessen tun Sie einfach so, als ob bereits eine
Methode existieren würde, die genau diese Aufgabe erledigt. Schreiben Sie also:
e
i
n
g
a
b
e=L
e
s
e
L
o
n
g
w
e
r
t
(
"
G
e
b
e
nS
i
eb
i
t
t
ee
i
n
eG
a
n
z
z
a
h
le
i
n
:"
)
;
An dem Namen der unbekannten Methode taucht daraufhin das Zeichen für einen Smarttag auf.
4. Öffnen Sie das Smarttagmenü, wählen Sie den Befehl Methodenstub für "LeseLongwert" in
"Stubs.Program" generieren. Die IDE analysiert den Aufruf der noch nicht vorhandenen Methode
und erstellt automatisch das passende Codegerüst. Einfacher geht es nicht!
static void Main(string[] args)
{
long eingabe;
int quersumme;
eingabe = LeseLongwert("Geben Sie bitte eine Ganzzahl ein: ");
}
private static long LeseLongwert(string p)
{
throw new Exception("The method or operation is not implemented.");
}
5. Sie können nun mit der Codierung des Hauptprogramms fortfahren und eine weitere leere Metho-
de zur Berechnung der Quersumme erstellen. Den vollständigen Code (allerdings ohne die Implementierung der beiden Methoden) finden Sie im Beispielprojekt Kap08\Stubs in dem Ordner, in
den die Beispiele für dieses Buch installiert wurden.
Das Arbeiten mit Methodenstubs hat beim Codieren zwei Vorteile: Zum einen können Sie sich, wie
bereits erwähnt, auf die Programmierung der übergeordneten Methode konzentrieren und müssen sich
in einer frühen Phase der Programmentwicklung nicht mit Detail-Problemen beschäftigen. Zum anderen lässt sich Ihr Code nach wie vor kompilieren und sogar starten, da alle verwendeten Methoden
bereits vorhanden sind.
Ein Aufruf der Methoden erzeugt eine Ausnahme, da die Methodenstubs standardmäßig eine entsprechende Anweisung enthalten. Es steht Ihnen natürlich frei, die Methodengerüste mit eigenen Anweisungen zu füllen.
127
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
III – Konzepte der OOP
Abbildung 8.6: Das Smarttagmenü der unbekannten Methode.
Datei: 08.doc, Seite128
31. Oktober 2006
Kapitel 8
Methoden
Methoden extrahieren
Beim Extrahieren von Methoden passiert gewissermaßen das genaue Gegenteil vom Generieren von
Methodenstubs. Denn jetzt soll nicht aus einem Methodenaufruf eine leere Methode erstellt, sondern
bereits bestehender Code in eine Methode überführt werden. Am besten greifen Sie direkt zur Tastatur
und probieren dieses bemerkenswerte Feature sofort aus:
1. Öffnen Sie das Projekt Kap08\Extrahieren, das Sie in dem Ordner finden, in den die Beispiele für
dieses Buch installiert wurden. Dieses Beispiel ist identisch mit dem Programm ListeFüllen aus Kapitel 7.
2. Wenn Sie sich den Code der Main-Methode ansehen, werden Sie feststellen, dass die Methode am
Anfang und innerhalb der do-while-Schleife eine identische Gruppe von jeweils drei Anweisungen
enthält, mit denen der Status des Arrays ausgegeben wird. Diese beiden Passagen sollen nun durch
einen Methodenaufruf ersetzt werden. Wie schätzen Sie den Zeitaufwand dafür ein? Eine Minute?
Fünf Minuten? Wir behaupten, es ist lediglich eine Sache von wenigen Sekunden.
3. Markieren Sie die drei folgenden Zeilen am Anfang der Main-Methode:
Console.WriteLine("Kapazität des Arrays: {0} Elemente", arrayListe.Capacity);
Console.WriteLine("Anzahl der Elemente : {0}", arrayListe.Count);
Console.WriteLine();
4. Klicken Sie mit der rechten Maustaste in die Markierung und wählen Sie im Kontextmenü den
Befehl Umgestalten/Methode extrahieren.
Abbildung 8.7: Aus den markierten Codezeilen soll eine neue Methode erstellt werden.
128
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite129
31. Oktober 2006
8.5 Gültigkeitsbereich von Variablen
5. Auf dem Bildschirm erscheint dann ein Dialog, in dem Sie einen Namen für die zu erstellende
Methode festlegen können.
Abbildung 8.8: Sie müssen lediglich einen Namen für die neue Methode eingeben.
6. Geben Sie einen Namen für die Methode ein (Pascal-Schreibweise) und klicken Sie auf OK. Das war
alles! Die Methode ist fertig und die markierten Zeilen sind durch einen passenden Methodenaufruf ersetzt. Die IDE hat richtig erkannt, dass die Methode genau einen Parameter benötigt (nämlich
die Variable arrayListe) und dass sie keinen Rückgabewert liefern muss.
III – Konzepte der OOP
static void Main(string[] args)
{
ArrayList arrayListe = new ArrayList(1);
string eingabe;
ArrayStatus(arrayListe);
...
}
private static void ArrayStatus(ArrayList arrayListe)
{
Console.WriteLine("Kapazität des Arrays: {0} Elemente", arrayListe.Capacity);
Console.WriteLine("Anzahl der Elemente : {0}", arrayListe.Count);
Console.WriteLine();
}
7. Ersetzen Sie jetzt auch die drei Codezeilen am Ende der do-while-Schleife durch den neuen Metho-
denaufruf. Hier eine knappe Schnellanleitung: Zuerst den neuen Methodenaufruf markieren und
mit Strg+C in die Zwischenablage übernehmen; dann die drei Codezeilen markieren und mit
Strg+V durch den Inhalt der Zwischenablage ersetzen.
8.5 Gültigkeitsbereich von Variablen
In Kapitel 4 haben Sie bereits erfahren, wie Variablen deklariert und initialisiert werden. In diesem Abschnitt wollen wir nun den sogenannten Gültigkeitsbereich einer Variablen untersuchen, d. h. wir wollen
klären, wann und wo eine deklarierte Variable überhaupt verwendet werden kann.
129
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite130
31. Oktober 2006
Kapitel 8
Methoden
Sehen Sie sich dazu zunächst den folgenden Programmcode an:
private static int NichtsNutz(int p)
{
int i;
i = p;
i = (30 * i) / (5 * 6);
return i;
}
In diesem Beispiel werden zwei lokale Variablen verwendet. Zum einen der übergebene Parameter p und
zum anderen die Variable i. Diese Variablen können nur innerhalb der geschweiften Klammern des
Methodenkörpers verwendet werden. Sie werden erst beim Aufruf der Methode im Speicher (auf dem
Stack) erzeugt und beim Beenden der Methode wieder von dort entfernt. Durch diese Abschottung wird
es auch möglich, in zwei Methoden den gleichen Namen für eine Variable zu benutzen, ohne dass sich
die beiden Variablen ins Gehege kommen.
Es gibt aber auch Variablen, deren Gültigkeitsbereich noch kleiner ist. Erinnern Sie sich an Kapitel 6, in
dem wir die verschiedenen Schleifenkonstrukte von C# vorgestellt haben? Dort haben wir in einigen
Beispielen sinngemäß folgende for-Schleife eingesetzt:
for (int i = 0; i <=10; i++)
{
// Anweisungen der for-Schleife
}
In diesem Fall wird die Variable i, die als Schleifenzähler fungiert, innerhalb der for-Anweisung deklariert und ist daher auch nur innerhalb dieser for-Schleife gültig. Wenn Sie hinter der for-Schleife versuchen, auf die Variable i zuzugreifen, reagiert der Compiler mit einer Fehlermeldung:
Abbildung 8.9: Der Gültigkeitsbereich der Variable i beschränkt sich auf die for-Schleife.
Die Schleifenvariable i ist also dem Code außerhalb der for-Schleife nicht bekannt. Interessanterweise
können Sie diese Fehlermeldung nicht beheben, indem Sie vor oder nach der for-Schleife eine Variable i
deklarieren. Denn auch dann erhalten Sie eine Fehlermeldung:
Abbildung 8.10: Der Compiler lehnt die zweite Deklaration der Variable i ab.
Diese Fehlermeldung erscheint auf den ersten Blick unlogisch, da wir ja zuvor gesehen haben, dass es die
Variable i hinter der for-Schleife aus Sicht des Compilers gar nicht gibt. Das ist auch nach wie vor richtig. Der Grund, warum der Compiler die zweite Deklaration ablehnt, liegt in der potentiellen Verwechs-
130
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite131
31. Oktober 2006
8.5 Gültigkeitsbereich von Variablen
lungsgefahr der beiden Variablen. Wenn Sie tatsächlich eine Variable i benötigen, auf die Sie sowohl in
der for-Schleife als auch in der restlichen Methode zugreifen können, müssen Sie sie auf Methodenebene
deklarieren:
static void Main(string[] args)
{
int i;
for (i = 0; i < args.Length; i++)
Console.WriteLine(i + ". Argument: " + args[i]);
Console.WriteLine("Inhalt von i: {0}", i);
}
Befehlszeilenargumente in der IDE eingeben
III – Konzepte der OOP
Wenn Sie in Ihrem Programm die Befehlszeilenargumente auswerten, können Sie zum
Testen des Programms die Befehlszeile festlegen, mit der das Programm aus der IDE gestartet
werden soll. Wählen Sie dazu Projekt/[Name des Projekts] – Eigenschaften und wechseln Sie
auf das Register Debuggen. Dort können Sie im Textfeld Befehlszeilenargumente die gewünschten Argumente eintragen.
Abbildung 8.11: Das Programm erhält die Befehlszeilenargumente beim nächsten Start.
131
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite132
31. Oktober 2006
Kapitel 8
Methoden
Methodenübergreifender Zugriff auf Variablen
Wenn Sie eine Variable außerhalb einer Methode deklarieren, erstreckt sich ihr Gültigkeitsbereich auf
die gesamte Klasse. In diesem Fall ist es auch unerheblich, an welcher Stelle des Klassenkörpers sich die
Deklaration befindet. Sie können sie entweder an den Anfang, ans Ende oder irgendwo zwischen zwei
Methoden unterbringen.
class Program
{
static void Main(string[] args)
{
Console.WriteLine(version);
VersionZeigen();
}
static void VersionZeigen()
{
Console.WriteLine(version);
}
static string version = "0.9";
}
In dieser Klasse wurde die Variable version außerhalb der beiden Methoden Main und VersionZeigen
deklariert und kann daher von beiden Methoden verwendet werden. Und wie Sie sehen, muss die Variable in diesem Fall nicht vor ihrer ersten Verwendung deklariert werden.
8.6 Methoden überladen
Zum Schluss dieses Kapitels wollen wir noch kurz auf das Überladen von Methoden zu sprechen kommen. Da wir dieses Thema in Kapitel 11 noch weiter vertiefen werden, beschränken wir uns an dieser
Stelle darauf, Ihnen einen ersten Überblick zu geben.
Unter dem Überladen von Methoden versteht man in C# folgendes: Wenn in einer Klasse mehrere Methoden vorhanden sind, die zwar alle den gleichen Namen, aber unterschiedliche Parameter besitzen,
nennt man diese Methoden überladen. Ein kleines Beispiel gefällig?
1. Erstellen Sie das Projekt Überladen vom Typ Konsolenanwendung.
2. Deklarieren Sie zunächst oberhalb der Main-Methode die Variable version:
static string version = "0.9a";
3. Erstellen Sie nun die erste Methode und nennen Sie sie ZeigeVersion. Die Methode soll einfach
den Inhalt der Variablen version auf dem Bildschirm ausgeben:
static public void ZeigeVersion()
{
Console.WriteLine(version);
}
4. Schreiben Sie jetzt eine zweite Methode. Sie soll ebenfalls ZeigeVersion heißen, aber einen Parame-
ter mit dem Datentyp string erwarten. Den übergebenen String soll sie dann zusammen mit der
Variable version ausgeben:
132
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite133
31. Oktober 2006
8.6 Methoden überladen
static public void ZeigeVersion(string ausgabetext)
{
Console.WriteLine(ausgabetext + version);
}
Voilà, damit haben Sie ihre erste überladene Methode erstellt!
5. Im nächsten Schritt wollen wir die Auswirkung dieser Überladung untersuchen. Geben Sie dazu in
der Main-Methode Zeige ein. Wie nicht anders zu erwarten, meldet sich sofort die IntelliSense und
zeigt die gewohnte Auswahlliste an.
6. Zeigen Sie mit der Maus ganz unten in der Liste auf den Eintrag ZeigeVersion. Es erscheint ein
III – Konzepte der OOP
Tooltipp mit dem Hinweis, dass diese Methode einmal überladen ist.
Abbildung 8.12: In der Auswahlliste von IntelliSense wird die Überladung angezeigt.
7. Vervollständigen Sie den Namen der Methode und geben Sie die öffnende runde Klammer ein.
Abbildung 8.13: Mit den Pfeiltasten können Sie die verschiedenen Überladungen anzeigen.
8. Jetzt können Sie mit den Pfeiltasten zwischen den beiden Überladungen wechseln und das vorhan-
dene Angebot prüfen. Um eine der beiden Varianten auszuwählen, vervollständigen Sie den Methodenaufruf mit den entsprechenden Parametern.
Überladene Methoden verhalten sich also aus Sicht des Programmierers wie eine einzelne Methode, die
mit unterschiedlichen Parametern aufgerufen werden kann. Damit der Compiler die Methodenaufrufe
auch richtig zuordnen kann, müssen folgende Bedingungen erfüllt sein:
„
Die Methoden müssen selbstverständlich den gleichen Namen besitzen.
„
Der Datentyp des Rückgabewertes muss bei allen Methoden identisch sein.
„
Die einzelnen Methoden müssen durch Anzahl und Datentyp der Parameter eindeutig zu unterscheiden sein. Das heißt, wenn die Anzahl der Parameter gleich ist, müssen sie sich mindestens an
einer Stelle in ihren Datentypen unterscheiden.
Auf den Punkt gebracht bedeutet das, die Methodensignatur muss innerhalb der Klasse eindeutig sein.
133
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite134
31. Oktober 2006
Kapitel 8
Methoden
8.7 Übungen zu diesem Kapitel
In diesem Abschnitt finden Sie einige Übungen zu diesem Kapitel. Die richtigen Antworten und Lösungen finden Sie wie immer auf der Website www.vsxpress.de.
Übung 8.1
Erstellen Sie eine Methode, die den Mittelwert aus drei Ganzzahlen berechnet und das Ergebnis als
double-Wert zurückgibt. Die Argumente sollen dabei als Werttypen übergeben werden.
Übung 8.2
Wie unterscheidet sich die Parameterübergabe an eine Methode bei Verwendung von ref und out?
Übung 8.3
Ändern Sie die Methode aus der ersten Übung so ab, dass sie eine beliebige Anzahl an Argumenten
entgegennimmt.
8.8 Zusammenfassung
In diesem Kapitel haben Sie gesehen, welche Regeln für die Erstellung von Methoden gelten und wie Sie
Visual C# 2005 Express Edition beim Schreiben von Methoden unterstützt:
„
Methoden helfen, ein Problem in überschaubare Teilaufgaben zu zerlegen.
„
Methoden können nur innerhalb einer Klasse definiert werden und müssen eine eindeutige Signatur besitzen. Unter einer Signatur versteht man die Kombination von Rückgabewert, Name und
Parameter einer Methode.
„
Damit IntelliSense eine Kurzbeschreibung der Methode anzeigen kann, müssen Sie vor der Methodendefinition einen speziellen Kommentarblock einfügen. Das Gerüst wird von der IDE automatisch erstellt, wenn Sie drei Schrägstriche eintippen.
„
Die Zugriffsmodifizierer public und private entscheiden über die Sichtbarkeit einer Methode. Damit
eine Methode auch außerhalb ihrer Klasse aufgerufen werden kann, muss sie als public definiert
werden.
„
Für die Namen von Methoden wird die Pascal-Schreibweise verwendet.
„
Die Parameter werden standardmäßig als Wert übergeben. Soll lediglich der Verweis auf eine Variable übergeben werden, muss dem Parameter das Schlüsselwort ref vorangestellt werden (sowohl
in der Definition als auch beim Aufruf). Alternativ kann mit dem Schlüsselwort out für einen Parameter festgelegt werden, dass er auch einen Verweis auf eine nicht initialisierte Variable akzeptiert.
134
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Datei: 08.doc, Seite135
31. Oktober 2006
8.8 Zusammenfassung
In einer Methodendefinition kann dem letzten Parameter das Schlüsselwort params vorangestellt
werden. Dadurch wird der Parameter zu einem optionalen Parameter, dem eine Parameterliste
übergeben werden kann.
„
Methodenstubs sind leere Codegerüste für Methoden, die die IDE automatisch aus einem Methodenaufruf erzeugen kann.
„
Die IDE kann aus einer markierten Codepassage eine Methode erzeugen. Dabei werden die benötigten Parameter automatisch erkannt. Die Codepassage wird dann aus dem Code entfernt und
durch einen entsprechenden Methodenaufruf ersetzt.
„
Der Gültigkeitsbereich einer Variablen ist der Bereich eines Programms, in dem die Variable aufgerufen werden kann. Damit eine Variable in der gesamten Klasse sichtbar wird, muss sie außerhalb
der Methoden deklariert werden. Variablen die innerhalb einer Methode deklariert sind, können
nur in der Methode selbst benutzt werden. Zusätzlich gibt es noch Schleifenvariablen, die innerhalb
einer Schleifenbedingung deklariert werden. Ihr Gültigkeitsbereich beschränkt sich auf den Anweisungsblock der Schleife.
„
Wenn mehrere Methoden den gleichen Namen und Rückgabetyp, aber unterschiedliche Parameterdefinitionen besitzen, spricht man von einer Methodenüberladung. Eine bekannte Methode, die
gleich mehrfach überladen ist, ist zum Beispiel WriteLine().
III – Konzepte der OOP
„
135
Probekapitel aus "Programmieren lernen mit Visual C# 2005", Microsoft Press. Klicken Sie hier um das Buch zu kaufen.
Beispielcode zu diesem Kapitel finden sie auf der Website zu diesem Buch und der Reihe "Richtig Einsteigen"
Herunterladen