Qualifizierte Namen in C♯
Das folgende Programm wurde schon behandelt. Seine Ausgabe ist der Wert des Wertnamens »global::System.Int32.MaxValue«.
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global::System.Int32.MaxValue ); }}global::System.Console.Out
2147483647
Im folgenden sollen nun solche Namen, wie beispielsweise der Wertname »System.Int32.MaxValue«, näher beschrieben werden.
Qualifizierte Namen
Ein qualifizierter Name ist ein Folge von Bezeichnern, die jeweils durch einen Punkt ».« miteinander verbunden sind. Ein qualifizierter Name muß also mindestens einen Punkt enthalten.
- Ein qualifizierter Name (Beispiel)
System.Int32.MaxValue
Namen
Ein Name ist ein qualifizierter Name (ein Name mit Punkt) oder ein Bezeichner (ein Name ohne Punkt). Namen dürfen also auch Punkte ».« enthalten, Bezeichner nicht.
Im Syntaxdiagramm wird der Aufbau eines Namens durch ein rekursives Diagramm beschrieben.
- Die Syntax von Namen
Name
.------. .-. .------------.
--->| Name |-->( . )--->| Bezeichner |--->
'------' '-' '------------'
Name
.------------.
--->| Bezeichner |--->
'------------'
Die Struktur eines qualifizierten Namens besteht darin, daß ein qualifizierter Name ein Bezeichner ist, vor dem noch ein durch einen Punkt abgetrennter Name steht. Der Punkt in qualifizierten Namen ist also linksassoziativ zu verstehen.
Ein Name besteht also entweder aus einem Namen, einem Punkt ».« (oberes Syntaxdiagramm) und einem Bezeichner oder nur aus einem Bezeichner (unteres Syntaxdiagramm).
Der Name »System« ist nur ein einfacher Bezeichner (unteres Syntaxdiagramm).
Der Name »System.Int32« wird durch den Punkt in den Namen »System« einerseits und den Bezeichner »Int32« andererseits zerlegt (oberes Syntaxdiagramm).
Der Name »System.Int32.MaxValue« wird den rechtesten Punkt in den Namen »System.Int32« einerseits und den Bezeichner »MaxValue« andererseits zerlegt (oberes Syntaxdiagramm).
Bezeichner
Wir hatten den Begriff „Bezeichner“ ja schon in einer früheren Lektion definiert.
Ein Bezeichner kann in dieser Lektion hier nun auch als ein Name ohne Punkt definiert werden. Man kann einen Bezeichner auch einen unqualifizierten Namen oder einen nicht-qualifizierten Namen nennen. Ein Bezeichner wird auch als einfacher Name bezeichnet.
»global« »::«
Die C♯LS erlaubt es, einem Namen auch noch die beiden lexikalischen Einheiten »global« »::« voranzustellen. Die Bedeutung dieses Vorsatzes, wird etwas später behandelt werden. Hier ist es nur wichtig, daß auch »global::System.Int32« immer noch wie ein Name verwendet werden kann. Die korrekte Fachbezeichnung dafür lautet “qualified alias member ”, wie bezeichnen solch einen solchen qualifizierten Aliaseintrag hier der Einfachheit halber ebenfalls als Namen. Dieser Name wird auch linksassoziativ gelesen, das heißt, daß »global::System« bereits ein Name ist, dem dann mit einem Punkt getrennt der Name »Int32« nachgestellt wird, wodurch sich der Name »global::System.Int32« ergibt. Dem kann dann mit einem Punkt wieder ein verfügbarer Bezeichner, wie »MaxValue« nachgestellt werden, um »global::System.Int32.MaxValue« zu erhalten.
Lexikalische Einheiten
Jeder Bezeichner und jeder Punkt in einem qualifizierten Namen stellt eine lexikalische Einheit dar. (In einem Punktnumerale, wie »3.2« ist der Punkt aber keine lexikalische Einheit, sondern nur das gesamte Numerale.) Auch das Doppelpunktpaar »::« stellt eine lexikalische Einheit dar.
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global
::
System
.
Int32
.
MaxValue ); }}global::System.Console.Out
2147483647
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( global :: System . Int32 . MaxValue ); }}global::System.Console.Out
2147483647
Syntax von Ausdrücken
Wir können die Syntax von Ausdrücken nun um die Definition von Namen erweitern. (Die darin verwendete Kategorie „Bezeichner“ wurde bereits in einer der früheren Lektionen durch ein Syntaxdiagramm beschrieben.)
- Neue, erweiterte Syntax (vereinfacht)
Ausdruck
.----------.
---.----------->| Literal |---------------------------.---->
| '----------' |
| .---------------. |
'----------->| Aliaseintrag |----------------------'
| '---------------' |
| .-. .----------. |
'--->( - )-->| Ausdruck |---------------------------'
| '-' '----------' |
| .-. .----------. |
'--->( + )-->| Ausdruck |---------------------------'
| '-' '----------' |
| .-. .----------. .-. |
'--->( ( )-->| Ausdruck |-->( ) )-------------------'
| '-' '----------' '-' |
| .----------. .-. .----------. |
'----------->| Ausdruck |-->( / )-->| Ausdruck |----'
| '----------' '-' '----------' |
| .----------. .-. .----------. |
'----------->| Ausdruck |-->( + )-->| Ausdruck |----'
| '----------' '-' '----------' |
| .----------. .-. .----------. |
'----------->| Ausdruck |-->( - )-->| Ausdruck |----'
| '----------' '-' '----------' |
| .----------. .-. .----------. |
'----------->| Ausdruck |-->( * )-->| Ausdruck |----'
'----------' '-' '----------'Aliaseintrag
.-------------------------.
| .--------. .-. v .------.
---'--->| global |-->( : )---'--->| Name |--->
'--------' '-' '------'Name
.-----------------------.
| .------. .-. v .------------.
---'--->| Name |-->( . )---'--->| Bezeichner |--->
'------' '-' '------------'
Übungsfragen
? Namen
Welche der folgenden Texte sind Namen?
- »2147483647«
- »System.Int32.MaxValue«
- »MaxValue«
? Qualifizierte Namen
Welcher der folgenden Namen ist einfach (also ein Bezeichner) und welcher ist ein qualifizierter Name?
- »System.Int32.MaxValue«
- »MAX_VALUE«
? Lexikalische Einheiten zählen
Wie viele lexikalische Einheiten umfassen die folgenden Ausdrücke jeweils?
- »2147483647«
- »System.Int32.MaxValue«
- »2.47«
- »MaxValue«
Zitate *
- CLS5
- Members
- Namespaces and types have members. The members of an entity are generally available through the use of a qualified name that starts with a reference to the entity, followed by a “.” token, followed by the name of the member.