Funktionen und Prozeduren in VB.NET 1. Funktionen: geben einen berechneten Wert zurück als Ergebnis Function name (Parameter) As Typ …… name = ……….. `Ergebnis der Berechnung wird der Funktion übergeben Oder: Return = ……… `auch so kann das Ergebnis der Funktion übergeben werden End Function Der Typ gibt an von welchem Datentyp das Ergebnis der Berechnung sein wird. Fehlt diese Angabe, dann wird standardmäßig Object angenommen. Der Code einer Funktion muss auf Modul oder Klassenebene definiert werden – nicht innerhalb einer Prozedur. Das Schlüsselwort Shared ist erforderlich, damit die Funktion in den Prozeduren des Moduls oder der Klasse ohne Instanzierung aufrufbar wird. Shared Function Brutto(ByVal Netto As Decimal, ByVal MwSt As Decimal) As Decimal Return CDec(Netto * (1.0 + MwSt / 100.0)) End Function Netto und Mwst sind die Parameter, die zum Berechnen nötig sind für die Funktion. Die Funktion könnte dann aufgerufen werden in einer Prozedur: Preis = Brutto(Netto, MwSt) Die Variablen Netto und MwSt müssen Werte enthalten und das Ergebnis, das die Funktion berechnet und zurück liefert wird in der Variaben Preis gespeichert. 2. Prozeduren: arbeiten einfach Arbeitsaufträge ab Sub Name (Parameter) …….. End Sub Auch Prozeduren werden innerhalb eines Moduls oder einer Klasse definiert. Man kann also keine Prozedur innerhalb einer anderen Prozedur vereinbaren! Auf Klassenebene muss vor dem Wort Sub auch noch Shared angegeben werden (z. B. Shared Sub ……. End sub) Da eine Prozedur keinen Rückgabewert liefert muß auch kein Prozedurtyp angegeben werden. Die als Parameter angegebenen Werte gelten innerhalb der Prozedur als lokale Variable. In VB 2005 können Prozeduren mit oder ohne Call aufgerufen werden, die Parameter sind aber immer in Klammern zu setzen. 3. Parameterübergabe Allgemein: Wenn Module in Prozeduren und Funktionen aufgeteilt werden, ist die Versuchung groß zum Datentausch zwischen den Prozeduren private oder öffentliche Variablen zu verwenden. Da dies aber zu Problemen führen kann, sollte der Austausch von Werten mittels Übergabe von Parametern erfolgen! a) Parameter und Argumente Parameter werden bei der Definition einer Prozedur für die zu übergebenden Argumente eingesetzt: Sub Gehalt Dim Name as String Dim Alter as Integer Dim Gehalt as Currency Name = „Müller“ Alter = 35 Gehalt = 2400 Call Drucken(Name, Alter, Gehalt, „Gehaltsliste“) End sub ´Argumente Sub Drucken (Name as String, Alter as Integer, Brutto as Currency, Kopf as String) ……… ´Parameter End sub Beachten Sie: Die Namen der Variablen für die Parameterübergabe sind bedeutungslos, es müssen nur die Datentypen übereinstimmen! Wird die Prozedur Drucken aufgerufen, ersetzt Visual Basic die Parameter durch die übergebenen Argumente. Die Parameter werden innerhalb der jeweiligen Prozedur wie lokale Variablen behandelt und sind demnach nur innerhalb der Prozedur gültig. Eine Argumentenliste kann bestehen aus (durch Komma getrennt): Variablen Konstanten Ausdrücken Tabellen oder Tabellenelementen, denen linke und rechte Klammern folgen Die Parameterliste kann bestehen aus (durch Komma getrennt): Variablen (außer Strings fester Länge) Tabellen oder Tabellenelementen, denen linke und rechte Klammern folgen Grundsätzlich kann zwischen zwei Varianten der Variablenübergabe gewählt werden: Übergabe nach Wert (die aufgerufene Prozedur hat nur lesenden Zugriff auf die Argumente, kann sie also nicht verändern) Übergabe nach Referenz (die auch die Veränderung der übergebenen Argumente in der aufgerufenen Prozdur erlaubt) b) Übergabe nach Wert (call by value): Ist die sicherere Variante, da keine Änderungen der übergebenen Variablen erlaubt sind. Unterschiede gibt es beim Aufruf der Prozedur: Call Test (Name, Alter) `nach Referenz Call Test((Name),(Alter)) `nach Wert Beachten Sie: Wird eine Prozedur aufgerufen, der ein Argument nach Wert übergeben wird, so wird ihr lediglich eine Kopie des Wertes übergeben, nicht das Original. Die übergebenen Variablen können dann zwar in der Unterprozedur verändert werden, aber nach Rückkehr auf die aufgerufene Ebene erhalten sie wieder den ursprünglichen Wert. Beispiel Sub Berechnen Dim Betrag as Currency Betrag = 1000 Call Skonto((Betrag)) `Übergabe nach Wert End sub Sub Skonto(Betrag as Currency) Debug.Print „3% Skonto von“; Betrag; „€ sind“; Betrag*.03; „€“) End sub Ergebnis: 3% Skonto von 1000 € sind 30 € c) Übergabe nach Referenz (call by Reference) Hier wird nur die Adresse des Wertes im Speicher (=Referenz) übergeben, wodurch es der Prozedur möglich ist, den Inhalt der übergebenen Variablen auch auf der aufrufenden Ebene zu verändern. Beispiel Sub Berechnung Dim Betrag as Currency Dim Skonto as Currency Betrag = 1000 Call Skonto(Betrag, Skonto) `nach Referenz Debug.Print „3% Skonto von“; Betrag; „€ sind“; Skonto; „€“ End sub Sub Skontorechnen(Betrag as Currency, Skonto as Currency) Skonto = Betrag * .03 End sub Beachten Sie: Hier werden nur die Adressen der Variablen Betrag und Skonto an die Prozedur Skontorechen übergeben. Somit weiß die Prozedur wo sich die Variablen im Speicher befinden und kann deren Wert auch beeinflussen. Dies ist hier auch notwendig, da der errechnete Skontobetrag ja an die aufrufende Prozedur Berechung zurückgegeben werden muss, damit er mit ihr ausgedruckt werden kann. d) Die Schlüsselwörter ByVal und ByRef So kann im Kopf der Prozedur festgelegt werden, ob der Paramenter als Wert oder Referenz übergeben werden soll. ByRef muß nicht explizit angegeben werden. ByVal kann bewirken, dass eine Prozedur, die standardmäßig per Referenz übergeben wird, das errechnete Ergebnis nicht an die aufrufenden Prozedur übergeben kann. Beispiel: Sub Berechnung Dim Betrag as Currency Dim Skonto as Currency Betrag = 1000 Call Skonto(Betrag, Skonto) Debug.Print „3% Skonto von“; Betrag; „€ sind“; Skonto; „€“ End sub Sub Skonto(Betrag as Currency, ByVal Skonto as Currency) Skonto = Betrag * .03 End sub e) Gemische Argumentenübergabe Sub Berechnung Dim Betrag as Currency Dim Skonto as Currency Betrag = 1000 Call Skonto((Betrag), Skonto) `byVal und byRef Debug.Print „3% Skonto von“; Betrag; „€ sind“; Skonto; „€“ End sub Sub Skonto(Betrag as Currency, Skonto as Currency) Skonto = Betrag * .03 Betrag = 0 End sub