Argumente in C# (Argumente in C#), Lektion, Seite 723407
https://www.purl.org/stefan_ram/pub/argumente_csharp (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C#-Kurs

Argumente in C♯ 

Einführendes Beispiel

Das folgende Beispiel zeigt die Anwendung des schon behandelten unären Operators »-« auf dem Operandenausdruck »( 3m )«.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( -( 3m ) ); }}
global::System.Console.Out
-3

Im folgenden Programm wurde der Operator »-« durch den Namen »global::System.Decimal.Negate« ersetzt.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Decimal.Negate( 3m )); }}
global::System.Console.Out
-3

Das Ergebnis von »global::System.Decimal.Negate« ist dem Ergebnis des Operators »-« gleich. Allerdings sind die runden Klammern um »3m« bei der Verwendung des Namens  an Stelle des Operators notwendig, während sie bei Verwendung des Operators auch hätten entfallen können.

Bei »global::System.Decimal.Negate« handelt es sich ebenfalls um eine Methode, nur sind die Klammern des Aufrufausdrucks diesmal nicht leer (wie bei den bisher behandelten Aufrufausdrücken), sondern enthalten einen Operandenausdruck. Der gesamte Aufrufausdruck ist also »global::System.Decimal.Negate( 3m )«.

Ein Aufrufausdruck
global::System.Decimal.Negate( 3m )

Aussprache eines Aufrufausdrucks

Die runde Klammer auf »(« wird im Deutschen (in der Mathematik) bei Verwendung der Funktionsschreibweise meist als „von“ gesprochen. So ist »global::System.Decimal.Negate( 3m )« „Negate  von  Drei“ oder „das Negative von  Drei“ (Man kann den langen Namen »global::System.Decimal.Negate« beim Aussprechen ruhig abkürzen, solange dadurch keine Mißverständnisse zu befürchten sind). Den Ausdruck »cos( 0 )« kann man beispielsweise als „Kosinus von Null“ aussprechen. Ausführlicher nennt man »cos( 0 )« „der Aufruf der Methode »cos« mit dem Argument(wert) »0«“.

Man kann sich den Aufruf »global::System.Decimal.Negate( 3m )« auch als Frage veranschaulichen: „Was ist das Negative von »3«?“ – er antwortet dann mit »-3«.

Syntax

Das folgende Syntaxdiagramm erweitert das bisherige Syntaxdiagramm für Aufrufausdrücke um die Möglichkeit eines in die Klammern geschriebenen Ausdrucks.

Aufrufausdruck (Syntaxdiagramm)
Aufrufausdruck
.-------------------.
.---------------. .-. | .----------. v .-.
--->| Aliaseintrag |--->( ( )---'--->| Ausdruck |---'--->( ) )--->
'---------------' '-' '----------' '-'

Der Argumentausdruck

Ein in die Aufrufklammern geschriebener Ausdruck wird auch Argumentausdruck des Aufrufs  oder kurz Argumentausdruck  genannt.

(Die Aufrufklammern, welche das Argument enthalten, werden entsprechend hier auch manchmal als Argumentklammern  bezeichnet.)

Der Argumentwert

Der Wert des Argumentausdruck ist der Argumentwert.

Wenn es nicht wichtig ist, zwischen dem Argumentausdruck und Argumentwert zu unterscheiden, so spricht am auch einfach nur von einem Argument. Dann muß dem Zusammenhang entnommen werden, ob damit der Argumentausdruck  oder der Argumentwert  gemeint ist – manchmal sind auch beide Interpretationen gleichzeitig möglich.

Erklärung zur Bedeutung von Ausdrücken

Wir hatten Ausdrücke bereits als Quelltexte kennengelernt, welche man in den Ausdruckrahmen  einsetzen kann. Danach konnten wir Ausdrücke auch als das charakterisieren, was man als Operand  eines Operators schreiben kann. Nun können wir Ausdrücke auch noch dadurch charakterisieren, daß sie als Argumente  in Aufrufausdrücken verwendet werden können. Wenn man Argumente aber auch als eine Art von Operanden ansieht, dann ist es nicht nötig, sie ausdrücklich zu erwähnen, und wir können dann weiterhin einfach sagen: Ein Ausdruck  ist etwas, das in den Ausdruckrahmen eingesetzt werden oder als Operand verwendet werden kann.

Deterministische Methoden

Eine Methode, welche man mit einem Argument aufrufen kann, und welche einen Wert als Ergebnis liefert, der durch diese Methode und einen eventuellen Argumentwert bestimmt ist, nennt man auch eine deterministische Methode.

»global::System.Decimal.Negate« ist ein Beispiel für eine deterministische Methode, weil sich bei gleichem Aufruf auch der gleicher Wert ergibt, während die Methoden »global::System.AppDomain.GetCurrentThreadId()« nicht deterministisch ist, da sie auch bei gleicher Schreibweise des Aufrufs unterschiedliche Werte liefern kann.

Deterministische Methoden, die mit einem Argument aufgerufen werden, ähneln den Funktionen (Abbildungen) der Mathematik, während nicht-deterministische Methode in der Schulmathematik keine Entsprechung haben.

Die Auswertung: Erster Schritt: Die Inkarnation

Wenn eine Methode auf ein Argument angewendet wird, dann wird eine Verbindung  zwischen der Methode und dem Wert des Arguments hergestellt, die auch als Aktivierungsverbund  oder als eine Inkarnation  der Methode bezeichnet wird. (Auch bei Methoden ohne Argument gibt es eine entsprechende Vorbereitung zum Start der Methode, die wir hier ebenfalls als „Inkarnation“ bezeichnen.)

Im Ausdruck »global::System.Decimal.Negate( 3m )« ist die Verbindung zwischen dem Methodennamen und dem Argumentwert bereits für den Programmierer sichtbar, aber bei der Ausführung des Programms muß der Computer sie bei der Auswertung dieses Ausdrucks noch einmal neu anlegen. Dies ist die Inkarnation  der Methode. Das Wort „Inkarnation “ bedeutet hier den Prozeß des Zusammenfügens zweier Informationen und auch dessen Ergebnis, also die Verbindung zwischen Methode und Argumentwert.

Die Auswertung: Zweiter Schritt: Die Operation

Nachdem die Inkarnation hergestellt wurde, wird sie dann als eine Operation ausgeführt. Eine Operation  ist ein Vorgang der Datenverarbeitung, der ein Ergebnis liefern kann, wie hier den Wert »-3m«.

Eine Methode alleine  ist im allgemeinen noch keine  Operation, beispielsweise kann die Methode »global::System.Decimal.Negate( 3m )« alleine (ohne Inkarnation) noch nicht ausgeführt werden, weil ihr ja noch ein Argumentwert fehlt.

Anwendung

Wenn eine Methode mit einem Argument zusammen aufgerufen wird, dann sagt man auch, daß die Methode auf dieses Argument angewendet werde. Man nennt »global::System.Decimal.Negate( 3m )« also beispielsweise „die Anwendung  der Methode »global::System.Decimal.Negate« auf den Wert »3m«“. Damit kann sowohl der Ausdruck »global::System.Decimal.Negate( 3m )« als auch dessen Auswertung gemeint sein.

Argumentausdrücke

Die Methode »global::System.Math.Floor« ergibt die Abrundung des Wertes ihres Arguments.

Wir zeigen ein Beispiel mit einem Operatorausdruck als Argumentausdruck.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Floor( 2 + 3.5 )); }}
global::System.Console.Out
5

Wir zeigen ein Beispiel mit einem Namensausdruck als Argumentausdruck.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Floor( global::System.Math.PI )); }}
global::System.Console.Out
3

Wir zeigen ein Beispiel mit einem Aufrufausdruck als Argumentausdruck.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Floor
( global::Microsoft.JScript.MathObject.random() )); }}
global::System.Console.Out
0

Weiteres Beispiel

Das folgende Programm zeigt den C♯ -Ausdruck, welcher der deutschen Nominalphrase „Der Sinus von 2“ entspricht.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Sin( 2.0 )); }}
global::System.Console.Out
0.909297426825682

Übungsfragen

?   Ausdrücke lesen

Was ist der Argumentausdruck in dem Aufrufausdruck »global::System.Math.Floor( 3.2 )«?

Welchen Wert hat der Aufrufausdruck »global::System.Math.Floor( 3.2 )«?

Welchen Typ hat der Aufrufausdruck »global::System.Math.Floor( 3.2 )«?

?   Ausdrücke lesen (1)

Was ist der Argumentausdruck in dem Aufrufausdruck »global::System.Math.Floor( global::Microsoft.JScript.MathObject.random() * 4 )«?

Welche Werte kann dieser Argumentausdruck haben?

Welche Werte kann der Aufrufausdruck »global::System.Math.Floor( global::Microsoft.JScript.MathObject.random() * 4 )« haben?

Sind diese Wert alle annähernd gleich wahrscheinlich? (Zur Beantwortung dieser Frage kann angenommen werden, daß »global::Microsoft.JScript.MathObject.random()« alle Werte zwischen 0 und 1−2⁻⁵³ mit gleicher Wahrscheinlichkeit liefert.)

?   Ermittlung von Operanden ⃗

Kann es eine Funktion »f« geben, die wie in den folgenden Beispielen gezeigt, den linken Operanden  ihres Argumentausdrucks ergibt?

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( f( 1 + 3 )); }}
global::System.Console.Out
1
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( f( 2 + 2 )); }}
global::System.Console.Out
2
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( f( 3 + 1 )); }}
global::System.Console.Out
3

Operanden und Argumente *

Man kann den Argumentausdruck auch als den Operanden  des Aufrufs ansehen und den Rest (also den Methodennamen und die runden Klammern) als einen unären Zirkumfixoperator. Diese Sichtweise ist aber unüblich, zumal der Operator dann auch oft aus relative vielen einzelnen lexikalischen Einheiten bestünde. Trotzdem gilt alles, was wir hier über Operanden  sagen im Regelfall auch für Argumente. Daher ist es im allgemeinen eine Vereinfachung, wenn man ein Argument als eine Art von Operand ansieht, damit man nicht immer von „Operanden und Argumenten “ sprechen muß.

Ein Aufrufausdruck zerlegt in Operator und Operand

Operand
|
v

global::System.Decimal.Negate( 3m )
------------------------------ -

^ ^
'-------------------'
|
Operator

Übergabe des Argumentwerts *

Man kann sich den Sinn  eines Arguments auch so erklären: Die Methode »global::System.Decimal.Negate« benötigt noch Informationen, um ihre Arbeit tun zu können, und diese Informationen werden durch den Wert des Arguments geliefert. Das Argument enthält die Information, welche die Methode verarbeiten soll.

Da beim Aufruf einer Methode der Wert des Argumentausdrucks zur Laufzeit zusammen mit der Kontrolle (über den Computer) an die aufgerufene Methode übergeben wird, spricht man auch von der Übergabe  des Argumentwertes oder sagt, der Argumentwert werde an die aufgerufene Methode übergeben.

Hauptprogramm und »negateExact«

Hauptprogramm

|
|
| Übergabe der Kontrolle
| und des Wertes 3m
'------------------.
|
V
.---------------.
| Negate |
'---------------'
|
|
.<-----------------'
| Rueckgabe der Kontrolle
| und des Wertes -3m
|
v

Hauptprogramm

Das folgende Diagramm stellt dieselbe Situation mit etwas allgemeineren Begriffen vor.

Übergabe und Rückgabe der Kontrolle zur Laufzeit

Hauptprogramm

|
|
| Übergabe der Kontrolle
| und des Argumentwertes
'------------------.
|
V
.---------------.
| Unterprogramm |
'---------------'
|
|
.<-----------------'
| Rueckgabe der Kontrolle
| und des Ergebniswertes
|
v

Hauptprogramm

Ein- und Ausgabe bei Methoden *

Man kann eine Methode wie »global::System.Decimal.Negate« auch mit einer Backmaschine vergleichen, bei der man – vereinfacht gesagt – Mehl hinein gibt und Brot heraus bekommt: bei »global::System.Decimal.Negate« gibt man eine Zahl hinein und bekommt die negative Zahl heraus.

Insofern kann man eine Methode wie ein Maschine sehen, in eine Information eingegeben werden kann, und die dann eine andere Information dazu ausgibt. Gibt man in »global::System.Decimal.Negate« beispielsweise die Zahl »3m«, so kommt als Ausgabe die Zahl »-3m« heraus.

»global::System.Decimal.Negate« als Maschine mit einer Eingabe und einer Ausgabe

"Eingabe" "Ausgabe" (nur vergleichsweise Bezeichnungen)

.-------------------------------.
3m ---> | global::System.Decimal.Negate |---> -3m
'-------------------------------'

Übergabe Rückgabe (korrekte Bezeichnungen)

Freilich spricht man aber in diesem Fall normalerweise nicht  von „eingeben“ sondern von „übergeben“ und auch nicht von „ausgeben“, sondern von „zurückgeben“.

Auch wenn in diesem Abschnitt zu Lehrzwecken einmal von der „Eingabe“ und der „Ausgabe“ bei einer Methode gesprochen wurde, sollte man dafür normalerweise von der „Übergabe eines Argumentwertes an eine Methode“ und der „Rückgabe eines Ergebniswertes durch eine Methode“ sprechen.

Semantik eines Argumentwertes *

Die Bedeutung  eines bestimmten Argumentwertes für die Auswertung des Aufrufausdrucks wird durch die aufgerufene Methode beziehungsweise ihre Dokumentation jeweils individuell festgelegt.

Beispiel »global::System.Math.Floor« *

Um das Negative einer Zahl zu berechnen, ist eigentlich keine spezielle Methode nötig, da es ja dafür bereits den unären Operator »-« gibt. Es gibt aber auch Methoden, die mit einem Argumentausdruck aufgerufen werden können und zu denen es keinen  entsprechenden Operator gibt. Um auch für solche eine Methode ein Beispiel zu haben, wird in diesem Abschnitt die Methode »global::System.Math.Floor« als Beispiel vorgestellt.

Der Boden  (die Abrundung, englisch “floor ” /flɔɚ/) einer Zahl ist die größte ganze Zahl, welche nicht größer als die Zahl ist. So haben die Zahlen 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8 und 2.9 beispielsweise alle den Boden 2.

Auflistung ausgewählter Zahlen und ihres Bodens

Zahl Boden

1,50 1
1,75 1

2,00 2
2,25 2
2,50 2
2,75 2

3,00 3
3,25 3

So bedeutet der Aufrufausdruck »global::System.Math.Floor( 2.7 )« den „Boden von »2.7«“: Hier ist »global::System.Math.Floor« der Methodenname und »2.7« der Argumentausdruck des Aufrufausdrucks.

Der Wert des Aufrufs  wird durch den Methodennamen »global::System.Math.Floor« und den Wert des Operanden »2.7« gemeinsam  bestimmt.

Das folgende Beispiel zeigt, daß der Wert des Aufrufausdrucks für den Argumentwert »2.7« gleich »2.0« ist.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Floor( 2.7 )); }}
global::System.Console.Out
2.0

Das folgende Beispiel zeigt, daß der Wert des Aufrufausdrucks für den Argumentwert »3.7« gleich »3.0« ist.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Floor( 3.7 )); }}
global::System.Console.Out
3.0

Das folgende Beispiel zeigt, daß der Wert des Aufrufausdrucks für den Argumentwert »2.7« erneut gleich »2.0« ist.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Floor( 2.7 )); }}
global::System.Console.Out
2.0

Diese Beispiele veranschaulichen, daß die Methode »global::System.Math.Floor« deterministisch  ist, ihre Ergebnis ist also durch den Argumentwert bestimmt.

In diesem Kapitel werden Methodennamen, wie »global::System.Math.Floor« oft vorgestellt, ohne  daß die als Beispiel  ausgewählten speziellen Methoden dabei im Vordergrund stehen sollen. Es geht vielmehr darum, das allgemeine Phänomen der Methoden vorzustellen. Deswegen werden an dieser Stelle die Anwendungsmöglichkeiten der Methode »global::System.Math.Floor« nicht weiter vertieft. Es geht hier nicht  um die speziellen Möglichkeiten der Anwendung der Methode »global::System.Math.Floor«, sondern darum, wie es allgemein möglich ist, Methodennamen zu verwenden. »global::System.Math.Floor« dient dann lediglich als ein  Beispiel dafür.

Die Methode »global::System.Math.Floor« ist allerdings nicht nur als Beispiel dienlich; diese spezielle Methode zum Abrunden wird auch in der Anwendung der Programmiersprache C♯  öfter verwendet.

Obwohl die Methode »global::System.Math.Floor« ja immer ganze Zahlen  liefert, ist der Datentyp eines Aufrufs dieser Methode stets »double« und nicht etwa, wie man glauben könnte, »int«. Dadurch ist es möglich auch noch Ergebnisse zu liefern, die für den Datentyp »int« zu groß wären. Dies verdeutlicht, daß der Datentyp »int« nicht mit “integer ” (also einer ganzen Zahl) gleichzusetzen ist.

Operatorausdrücke  als Argumentausdrücke *

Da ein Argumentausdruck ein ein im Prinzip beliebiger Ausdruck sein kann, darf auch ein Operatorausdruck  (wie unten »2 + 3.5«) als Argumentausdruck verwendet werden. Der Argumentwert ist dann der Wert des verwendeten Operatorausdrucks.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Floor( 2 + 3.5 )); }}
global::System.Console.Out
5

Bei der Auswertung solch eines Aufrufs muß zuerst  der Operatorausdruck ausgewertet werden. Dieser hat in dem obigen Beispiel den Wert »5.5«. Dann wird die Inkarnation »global::System.Math.Floor( 5.5 )« hergestellt und ausgeführt; sie liefert schließlich das Ergebnis »5.0«.

Die Reihenfolge der Auswertung  ist hier also genau anders herum  als die Reihenfolge im Quelltext. Im Quelltext  steht zuerst  »floor« und dann »+«. Ausgewertet  wird zuerst »+« und dann »floor«.

Operatorausdrücke als Argumentausdrücke veranschaulichen noch einmal den Unterschied zwischen Argumentausdrücken  und Argumentwerten.

In den beiden folgenden Programmen ist der Argumentausdruck  einmal »5.5« und einmal »2 + 3.5«, der Argumtwert  ist aber in beiden Fällen derselben.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Floor( 5.5 )); }}
global::System.Console.Out
5
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Floor( 2 + 3.5 )); }}
global::System.Console.Out
5

Für das Ergebnis einer Auswertung eines Methodenaufrufs kommt es nur auf den Argumentwert  an, nicht auf den Argumentausdruck.

Das folgende Diagramm zeigt noch einmal die einzelnen Schritte der Auswertung von »global::System.Math.Floor( 2 + 3.5 )«.

Schritte bei der Auswertung von »global::System.Math.Floor( 2 + 3.5 )«

2 + 3.5

1.) | Operationsvorgang
v

5.5 Operationsprodukt

2.) | Inkarnationsvorgang
v (Einsetzen des Argumentwertes)

global::System.Math.Floor( 5.5 ) Inkarnationsprodukt

3.) | Operationsvorgang
v

5 Operationsprodukt

Ein Inkarnationsvorgang  ist das Einsetzen von Werten für Operanden (damit sind hier auch Argumente gemeint). Beispielsweise das Einsetzen des Wertes »5.5« für den Argumentausdruck »2 + 3.5«.

Ein Inkarnationsprodukt  ist das Ergebnis eines Inkarnationsvorganges, beispielsweise »global::System.Math.Floor( 5.5 )«. In einem Inkarnationsprodukt sind alle Operanden (einschließlich der Argumenten) Werte. Falls ein Methodenaufruf (wie beispielsweise »global::Microsoft.JScript.MathObject.random()«) gar keine Ausdrücke enthält, so kann dieser bereits so wie er ist als Inkarnationsprodukt angesehen werden.

Falls nur von einer „Inkarnation “ gesprochen wird, so ist damit – je nach Zusammenhang – entweder der Vorgang  oder das Produkt  einer Inkarnation gemeint.

Ein Operationsvorgang  ist die Ausführung eines Inkarnationsproduktes, beispielsweise die Auswertung von »global::System.Math.Floor( 5.5 )«.

Ein Operationsprodukt  ist das Ergebnis eines Operationsvorgangs, beispielsweise der Wert »5« als Produkt der Auswertung von »global::System.Math.Floor( 5.5 )«.

Falls nur von einer „Operation “ gesprochen wird, so ist damit der Vorgang  einer Operation gemeint.

Namen  als Argumentausdrücke *

Das folgende Beispiel zeigt, daß auch ein Name  (hier »global::System.Math.PI«) als Argumentausdruck  vorkommen kann. Der Argumentwert  ist dann der Wert des verwendeten Namens.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Floor( global::System.Math.PI )); }}
global::System.Console.Out
3

Das folgende Diagramm zeigt die einzelnen Schritte bei der Auswertung von »global::System.Math.Floor( global::System.Math.PI )«.

Schritte bei der Auswertung von »global::System.Math.Floor( global::System.Math.PI )«

global::System.Math.PI

1.) | Vorgang des Auslesen
v des Wertes des Namens

3.141592653589793 Ausgelesener Wert

2.) | Inkarnationsvorgang
v (Einsetzen des Argumentwertes)

global::System.Math.Floor( 3.141592653589793 ) Inkarnationsprodukt

3.) | Operationsvorgang
v

3 Operationsprodukt

Aufrufausdrücke  als Argumentausdrücke *

Das folgende Beispiel zeigt, daß auch ein Aufrufausdruck  (hier »global::Microsoft.JScript.MathObject.random()«) als Argumentausdruck vorkommen kann. Der Argumentwert ist dann der Wert einer Auswertung des als Argumentausdrucks verwendeten Aufrufausdrucks.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Floor( global::Microsoft.JScript.MathObject.random() )); }}
global::System.Console.Out
0

Das voranstehende Beispie; zeigt, daß ein Argumentwert auch ein Laufzeitwert sein darf. Durch Lesen des Quelltextes kann man den Argumentwert also gar nicht erfahren, man sieht nur den Argumentausdruck! Auch dies verdeutlicht wieder den Unteschied zwischen Argumentwert und Argumentausdruck.

Das folgende Diagramm zeigt die einzelnen Schritte bei der Auswertung von »global::System.Math.Floor( global::Microsoft.JScript.MathObject.random() )«. Da der Wert einer Auswertung von »global::Microsoft.JScript.MathObject.random()« von der Auswertung abhängt, können wir hier nur einen möglichen Wert als Beispiel  herausgreifen.

Schritte bei der Auswertung von »global::System.Math.Floor( global::Microsoft.JScript.MathObject.random() )«

global::Microsoft.JScript.MathObject.random()

1.) | Operationsvorgang zur
v angegebenen Inkarnation

0.876599014493339 Operationsergebnis (Beispiel)

2.) | Inkarnationsvorgang
v (Einsetzen des Argumentwertes)

global::System.Math.Floor( 0.876599014493339 ) Inkarnationsprodukt

3.) | Operationsvorgang
v

0 Operationsprodukt

Argumentausdrücke mit Aufrufen und Operatoren *

Es ist auch möglich, daß ein Argumentausdruck Namen, Operatoren und Aufrufausdrücke gleichzeitig  enthält.

Wir hatten bei dem folgenden Beispielprogramm schon gesehen, daß die Ausgabe immer »0« ist.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Floor( global::Microsoft.JScript.MathObject.random() )); }}
global::System.Console.Out
0

Da es langweilig ist, wenn die Ausgabe immer gleich ist, zeigen wir das folgende Beispielprogramm, welches nun sowohl  einen Methodennamen als auch  einen Operator im Argumentausdruck enthält.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Math.Floor( 3 * global::Microsoft.JScript.MathObject.random() )); }}
global::System.Console.Out
0
global::System.Console.Out
1
global::System.Console.Out
2

Das direkt obenstehende Programm kann nun bei jedem weiteren Start einen anderen Wert als beim vorherigen Start  ausgeben.

Das voranstehende Beispiel zeigt, daß ein Argumentwert auch ein Laufzeitwert (also ein vor der Ausführung des Programms noch nicht bekannter Wert) sein darf. Durch Lesen des Quelltextes kann man den Argumentwert also gar nicht erfahren, man sieht nur den Argumentausdruck! Auch dies verdeutlicht wieder den Unteschied zwischen Argumentwert und Argumentausdruck.

Auch hier hängen einige Werte nun wieder von der Auswertung ab und können deswegen im folgenden nur durch willkürlich ausgewählte Beispiele  dargestellt werden.

Mögliche Schritte bei der Auswertung von »global::System.Math.Floor( 3 * global::Microsoft.JScript.MathObject.random() )«

global::Microsoft.JScript.MathObject.random() Inkarnationsprodukt

1.) | Vorgang der Ermittlung
v einer Zufallszahl

0.570273922904462 Zufallszahl (zwischen 0 und 1)

2.) | Inkarnationsvorgang
v (Einsetzen der Operandenwerter)

3 * 0.570273922904462 Inkarnationsprodukt

3.) | Operationsvorgang
v

1.71082176871339 Operationsprodukt (zwischen 0 und 3)

4.) | Inkarnationsvorgang
v (Einsetzen des Argumentwertes)

global::System.Math.Floor( 1.71082176871339 ) Inkarnationsprodukt

5.) | Operationsvorgang
v

1 Operationsprodukt (0, 1 oder 2)

Das folgende Diagramm zeigt den Wertebereich des Ausdrucks »global::Microsoft.JScript.MathObject.random()« mit Hilfe von Nummernzeichen an.

Die Werte sind darin alle gleich wahrscheinlich.

Wertebereich des Ausdrucks »global::Microsoft.JScript.MathObject.random()«

global::Microsoft.JScript.MathObject.random()

0 0.25 0.5 0.75 1.0 1.25 1.5 1.75 2.0 2.25 2.5 2.75 3.0 3.25 3.5 3.75 4.0
| ' ' ' | ' ' ' | ' ' ' | ' ' ' |

####################

Das folgende Diagramm zeigt den Wertebereich des Ausdrucks »3 * global::Microsoft.JScript.MathObject.random()« mit Hilfe von Nummernzeichen an.

Die Werte sind darin weiterhin gleich wahrscheinlich, da die Streckung des Bereichs an der Art der Verteilung der Werte nichts ändert.

Wertebereich des Ausdrucks »3 * global::Microsoft.JScript.MathObject.random()«

3 * global::Microsoft.JScript.MathObject.random()

0 0.25 0.5 0.75 1.0 1.25 1.5 1.75 2.0 2.25 2.5 2.75 3.0 3.25 3.5 3.75 4.0
| ' ' ' | ' ' ' | ' ' ' | ' ' ' |

############################################################

Solch eine Multiplikation eines Bereichs mit einem positiven Faktor nennt man auch Skalierung. Falls der Faktor größer als »1« ist, spricht man von einer Streckung. Falls der Faktor kleiner als »1« ist, spricht man von einer Stauchung.

Das folgende Diagramm zeigt den Wertebereich des Ausdrucks »global::System.Math.Floor( 3 * global::Microsoft.JScript.MathObject.random() )« mit Hilfe von Nummernzeichen an.

Die drei Werte sind darin weiterhin gleich wahrscheinlich, weil zu jedem Wert des folgenden Diagramms ein Bereich aus dem vorigen Diagramm gehört, dessen Breite eins beträgt. Dadurch ergibt sich der Wert »1« gleich vielen Fällen wie der Wert »2« oder der Wert »3«.

Wertebereich des Ausdrucks »global::System.Math.Floor( 3 * global::Microsoft.JScript.MathObject.random() )«

global::System.Math.Floor( 3 * global::Microsoft.JScript.MathObject.random() )

0 0.25 0.5 0.75 1.0 1.25 1.5 1.75 2.0 2.25 2.5 2.75 3.0 3.25 3.5 3.75 4.0
| ' ' ' | ' ' ' | ' ' ' | ' ' ' |

# # #

Beispiel Schriftzeichen von Kennzahlen

Die Methode »global::System.Char.ConvertFromUtf32« ordnet ihrem numerischen Argumentwert ein Schriftzeichen vom Typ »string« zu.

Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Char.ConvertFromUtf32( 65 )); }}
Protokoll
A

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723407 stefan_ram:723407 Argumente in C# Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723407, slrprddef723407, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/argumente_csharp