Festlegung und Verwendung von Wertnamen in C♯
Erinnerung an Namen
Wir hatten vordefinierte Namen für Werte schon kennengelernt:
- »global::System.Math.PI«
- »global::System.Int32.MaxValue«
In dieser Lektion geht es nun darum, wie in einem Programm neue Namen für einen Wert festgelegt werden.
Festlegung eines Namens
Das folgende Programm zeigt ein Beispiel für die Festlegung eines Namens. Der Name »n« wird darin mit dem Typ »int« und dem Wert von »7« festgelegt.
Wir nennen einen solchen Namen auch einen Wertnamen, weil er im wesentlichen ein Name für einen Wert ist.
Nach solch einer Festlegung kann der Name als Ausdruck verwendet werden (also an einer Stelle, an der ein Ausdruck erwartet wird) und hat dann, bei einer Auswertung, den für ihn festgelegten Typ »int« und den für ihn festgelegten Wert »7«. (Dies ist wie bei den schon früher behandelten vordefinierten Namen wie »global::System.Math.PI«.) Wir nennen solch eine Verwendung eines Namens als Ausdruck auch einfach eine Verwendung des Namens.
Program.cs
public static class Program
{ public static void Main()
{global::System.Console.WriteLine( global::System.Math.PI );
global::System.Console.WriteLine( 7 );const int n = 7; /* Festlegung */
global::System.Console.WriteLine( n ); /* Verwendung */ }}Protokoll
3.14159265358979
7
7
Es können auch andere Datentypen, Name oder Werte verwendet werden, wie auch weitere Beispiele zeigen werden.
In dieser Lektion werden erstmals in diesem Kurse Typangaben wie »int« oder »double« auch bewußt innerhalb eines Programms eingesetzt. Zuvor traten sie nur in vorgegebenen Rahmen oder der Dokumentation auf.
Durch die Deklaration »const int n = 7;« wird wird festgelegt, daß im Gültigkeitsbereich der Deklaration (von der Stelle der Festlegung bis zum Ende des die Deklaration enthaltenden Blocks) der Name »n«
- den Typ »int« und
- den Wert »7«
haben soll.
Die Schreiben des Namens an einer Stelle, an der ein Ausdruck erwartet wird, ist eine Verwendung des Namens. Bei solch einer Verwendung im Gültigkeitsbereich einer Deklaration hat der Name den durch die Deklaration festgelegten Typ und Wert.
- C♯
const int n = 7;
- auf deutsch:
- „Festlegung des Namens »n« mit dem Typ »int« und dem Wert »7«“
Ein solcher Name wird auch als eine Konstante bezeichnet, um zu betonen, daß er einen konstanten (unveränderlichen) Wert besitzt.
Das folgende kürzere Programm zeigt noch einmal isoliert die Festlegung und Verwendung einer Konstanten.
Program.cs
public static class Program
{ public static void Main()
{const int n = 7; /* Festlegung */
global::System.Console.WriteLine( n ); /* Verwendung */ }}
Typen für eine Konstante
Die folgenden Typen kommen für eine Konstante in Frage:
- Typen
int
double
decimal
stringProgram.cs
public static class Program
{ public static void Main()
{const int n = 2;
const double x = 2.3;
const decimal d = 2.3m;
const string s = "abc";global::System.Console.WriteLine( n );
global::System.Console.WriteLine( x );
global::System.Console.WriteLine( d );
global::System.Console.WriteLine( s );}}
Protokoll
2
2.3
2.3
abc
Ausgabe des Wertes eines Namens
Das folgende Program zeigt verschiedene Möglichkeiten zur Ausgabe des Wertes eines Namens.
Program.cs
public static class Program
{ public static void Main()
{const int n = 7;
global::System.Console.WriteLine( "n = "+n+"." );
global::System.Console.WriteLine( $"n = {n}." );
global::System.Console.WriteLine( "n = {0}.", n );
}}
- Protokoll
n = 7.
n = 7.
n = 7.
Die Zeichenfolge eines Namens
Mit einem nameof-Ausdruck kann der Bezeichner einer Konstanten als Zeichenfolge ausgedrückt werden.
Program.cs
public static class Program
{ public static void Main()
{const int n = 7;
global::System.Console.WriteLine( n );
global::System.Console.WriteLine( "n" );
global::System.Console.WriteLine( nameof( n ));
global::System.Console.WriteLine( nameof( n ) + $" = {n}" ); }}Protokoll
7
n
n
n = 7
Vorteile der Verwendung »nameof« gegenüber »"n"« sind:
- Es ist wahrscheinlicher, daß Tippfehler schon vom Compiler erkannt und gemeldet werden.
- Werkzeuge zur automatischen Analyse und Veränderung von Quelltext können erkennen, daß ein Name verwendet wird, und diesen so richtig behandeln (beispielsweise bei einer automatischen Umbenennung)
Ein Name steht in der Regel für seinen Wert, die Verwendung in »nameof« ist jedoch eine Ausnahme von dieser Regel.
Namen als eine Art von Abkürzung
Das folgende Programm zeigt die Festlegung eines Namens als eine Art von Abkürzung.
Program.cs
public static class Program
{ public static void Main()
{const string lkw = "Lastkraftwagen";
global::System.Console.WriteLine
( $"Ein {lkw}-Fahrer lebt in seinem Fahrzeug." ); }}Protokoll
Ein Lastkraftwagen-Fahrer lebt in seinem Fahrzeug.
Man kann sich vorstellen, daß bei der Interpretation des obigen Programms als ein Zwischenschritt der Ausdruck rechts vom Gleichheitszeichen an Stelle des Namens links vom Gleichheitszeichen eingesetzt wird.
Program.cs
public static class Program
{ public static void Main()
{global::System.Console.WriteLine
( $"Ein {"Lastkraftwagen"}-Fahrer lebt in seinem Fahrzeug." ); }}Protokoll
Ein Lastkraftwagen-Fahrer lebt in seinem Fahrzeug.
Festlegung eines Namens für die Lichtgeschwindigkeit
Das folgende Programm zeigt die Festlegung eines Namens für den Zahlenwert der Lichtgeschwindigkeit im Vakuum in der Einheit m/s.
Program.cs
public static class Program
{ public static void Main()
{const int c = 299792458;
global::System.Console.WriteLine
( $"Die Lichtgeschwindigkeit ist gleich {c} m/s." ); }}Protokoll
Die Lichtgeschwindigkeit ist gleich 299792458 m/s.
Fehlende Festlegungen
Das folgende Programm zeigt das Verhalten einer C♯ -Implementation beim Fehlen einer Festlegung für einen Namen.
Program.cs
public static class Program
{ public static void Main()
{global::System.Console.WriteLine
( $"Die goldene Zahl ist gleich {g}." ); }}Protokoll
Program.cs(6,38): error CS0103: The name 'g' does not exist in the current context
Schreibweisen
Für das Fünffache eines Wertes ‹ x › schreibt man in der Mathematik oft ‹ 5x ›, für das Produkt von ‹ x › und ‹ y › schreibt man oft ‹ xy ›.
In C♯ muß für Produkte stets der Multiplikationsoperator »*« verwendet, also »5 * x« beziehungsweise »x * y« geschrieben werden.
Übungsfragen
? Interpretation einer Festlegung
Ist das folgende Programm korrekt und, wenn ja, was gibt es aus?
Program.cs
public static class Program
{ public static void Main()
{const int n = 4;
global::System.Console.WriteLine( n + 1 );
global::System.Console.WriteLine( n ); }}
? Interpretation einer Festlegung (1)
Ist das folgende Programm korrekt und, wenn ja, was gibt es aus?
Program.cs
public static class Program
{ public static void Main()
{const string s = 4;
global::System.Console.WriteLine( s + 1 ); }}
? Vervollständigung zu einem Programm
Was gehört an die Stelle der Lücke in dem folgenden Text, damit er als Programm ausgeführt werden kann?
Program.txt
public static class Program
{ public static void Main()
{const __________ k = "2.3";
global::System.Console.WriteLine( k ); }}
? Vervollständigung zu einem Programm (1)
Was gehört an die Stelle der Lücke in dem folgenden Text, damit er als Programm ausgeführt werden kann?
Program.txt
public static class Program
{ public static void Main()
{const double __________ = 5.6;
global::System.Console.WriteLine( x ); }}
? Vervollständigung zu einem Programm (2)
Was gehört an die Stelle der Lücke in dem folgenden Text, damit er als Programm ausgeführt werden kann und die Zeile »7« ausgibt?
Program.txt
public static class Program
{ public static void Main()
{const int i = __________;
global::System.Console.WriteLine( i ); }}
? Interpretation von Festlegungen (2)
Ist das folgende Programm korrekt und, wenn ja, was gibt es aus?
Program.cs
public static class Program
{ public static void Main()
{const int n = 4;
const int m = n + n;global::System.Console.WriteLine( n + 1 );
global::System.Console.WriteLine( m + 1 ); }}
? Interpretation von Festlegungen (3)
Ist das folgende Programm korrekt und, wenn ja, was gibt es aus?
Program.cs
public static class Program
{ public static void Main()
{const int n = 2;
const double x = n / 4;global::System.Console.WriteLine( n );
global::System.Console.WriteLine( x ); }}
? Beurteilung von Programmen
Die beiden folgenden Programme kommen zum selben Ergebnis. Welches gefällt Ihnen besser? Warum?
Program.cs
public static class Program
{ public static void Main()
{const double laengeInZentimetern = 2.0;
const double zentimeterInMillimetern = 10.0;
const double laengeInMillimetern = laengeInZentimetern * zentimeterInMillimetern;global::System.Console.WriteLine( laengeInMillimetern ); }}
Protokoll
20
Program.cs
public static class Program
{ public static void Main()
{global::System.Console.WriteLine( 2.0 * 10.0 ); }}
Protokoll
20
? Interpretation einer Festlegung (4) *
Ist das folgende Programm korrekt und, wenn ja, was gibt es aus?
Program.cs
public static class Program
{ public static void Main()
{const int x = 4;
global::System.Console.WriteLine( global::System.Math.Abs( x )); }}
? Interpretation einer Festlegung (5) *
Ist das folgende Programm korrekt und, wenn ja, was gibt es aus?
Program.cs
public static class Program
{ public static void Main()
{const double x = 2.7;
global::System.Console.WriteLine
( global::System.Char.ConvertFromUtf32( x )); }}
Übungsaufgaben
Übung
/ Verdoppeln einer Zahl
Schreiben Sie in das folgende Programm an die Stelle von "/* ... */" einen Ausdruck, so daß der Wert des Namens »dasDoppelte« das Doppelte des Wertes des Namens »zahl« beträgt! Falls die Deklaration »const int zahl = 4;« später in »const int zahl = 5;« verändert wird, soll der Wert von »dasDoppelte« sich automatisch anpassen (und dann »10« betragen).
Program.cs
public static class Program
{ public static void Main()
{const int zahl = 4;
const int dasDoppelte = /* ... */;
global::System.Console.WriteLine( dasDoppelte ); /* sollte zunaechst 8 ausgeben */
}}
/ Deklaration einer Konstanten, 0
Schreiben Sie ein C♯ -Programm, in welchem in einem Block eine Konstante vom Typ »int« mit dem Namen »i« und dem Wert »2« deklariert wird. Das Programm soll dann den Wert dieser Konstanten ausgeben. (Das Programm soll nichts anderes enthalten oder tun.)
Reserveaufgaben
/ Deklaration einer Konstanten, 1
Hinweis für den Dozenten ► Diese Reserveaufgabe nur bei Bedarf und erst nach der Nachbesprechung der vorherigen Aufgabe gestellt werden.
Schreiben Sie ein C♯ -Programm, in welchem in einem Block eine Konstante vom Typ »double« mit dem Namen »x« und dem Wert »4.8« deklariert wird. Das Programm soll dann den Wert jener Konstanten ausgeben. (Das Programm soll nichts anderes enthalten oder tun.)
/ Deklaration einer Konstanten, 2
Hinweis für den Dozenten ► Diese Reserveaufgabe nur bei Bedarf und erst nach der Nachbesprechung der vorherigen Aufgabe gestellt werden.
Schreiben Sie ein C♯ -Programm, in welchem in einem Block eine Konstante vom Typ »string« mit dem Namen »s« und dem Wert »"abc"« deklariert wird. Das Programm soll dann den Wert jener Konstanten ausgeben. (Das Programm soll nichts anderes enthalten oder tun.)