Deklarationen

Werbung
C#
Gültigkeitsbereich - Deklarationsraum
Programmbereich, zu dem eine Deklaration gehört
Arten von Gültigkeitsbereichen
-
1
Namespace
: Deklarationen von Klassen, Interfaces, Structs, Enums, Delegates
Klasse, Interface, Struct : Deklarationen von Membervariablen, Methoden, ...
Enum :
Deklarationen von Enumerationskonstanten
Block :
Deklarationen lokaler Variablen
© 2006 Dagmar Walddobler
C# Gültigkeitsbereich - Regeln
Deklarationsregeln
- Kein Name darf in einem Gültigkeitsbereich (=Deklarationsraum) mehrfach deklariert werden.
- Er darf aber in inneren Deklarationsbereichen neu deklariert werden (außer in inneren
Anweisungsblöcken).
Sichtbarkeitsregeln
- Ein Name ist in seinem ganzen Deklarationsraum sichtbar, lokale Variablen allerdings erst
ab ihrer Deklaration.
- Deklarationen in inneren Deklarationsräumen verdecken gleichnamige Deklarationen aus
äußeren Deklarationsräumen.
- Kein Name ist außerhalb seines Deklarationsraums sichtbar.
- Sichtbarkeit kann mit Attributen eingeschränkt werden (private, protected, internal, ...)
2
© 2006 Dagmar Walddobler
C# Gültigkeitsbereich Block
Verschiedene Arten von Blöcken
}
•
•
•.
•
3
void fkt (int x)
{... lokale Variablen ...
if (...)
... lokale Variablen ...
}
for (int i = 0; ...)
{ ... lokale Variablen ...
}
// Methodenblock
// if- Block
// for-Block
Gültigkeitsbereich eines Blocks schließt Gültigkeitsbereich geschachtelter Blöcke ein.
Funktions-Paramater gehören zum Gültigkeitsbereich des Methodenblocks
Deklaration einer Laufvariable gehört zum Gültigkeitsbereich des for-Blocks.
Deklaration einer lokalen Variablen muss ihrer Verwendung vorausgehen.
© 2006 Dagmar Walddobler
C# Deklaration lokaler Variablen
void fkt (int a)
{ int b;
if (...) {
int b;
// Fehler: b bereits in äußerem Block deklariert
int c;
int d;
...
}
else { int a;
// Fehler: a bereits im äußeren Block deklariert (Parameter)
int d;
// ok: keine Überschneidung mit d im if-Block
}
for (int i = 0; ...) {...}
for (int i = 0; ...) {...}
// ok: keine Überschneidung mit i aus letzter Schleife
int c;
// Fehler: c bereits in einem inneren Blocx deklariext
}
4
© 2006 Dagmar Walddobler
C# Gültigkeitsbereich: Namespace
Ein Namensraum (Namespace) bezeichnet einen Gültigkeitsbereich für Klassen.
Innerhalb eines Namensraums können mehrere Klassen oder sogar weitere Namensräume
deklariert werden.
Dabei ist ein Namensraum nicht zwangsläufig auf eine Datei beschränkt, innerhalb
einer Datei können mehrere Namensräume deklariert werden, ebenso ist es möglich,
einen Namensraum über zwei oder mehrere Dateien hinweg zu deklarieren.
Namensräume deklarieren
Die Deklaration eines Namensraums geschieht über das reservierte Wort namespace.
Darauf folgen geschweifte Klammern, die den Gültigkeitsbereich des Namensraums
angeben.
In einem Namensraum werden nur Klassen deklariert, keine Methoden oder Variablen
– diese gehören dann in den Gültigkeitsbereich der Klasse.
5
© 2006 Dagmar Walddobler
C# Gültigkeitsbereich: Namespace
Die Deklaration eines Namensraums mit der Bezeichnung Ctitel würde also wie folgt
aussehen:
namespace Figuren
{
//Hier die Deklarationen innerhalb des Namensraums
}
Wenn die Datei für weitere Klassen nicht ausreicht oder zu unübersichtlich werden würde,
kann in einer weiteren Datei der gleiche Namensraum deklariert werden. Beide Dateien
zusammen wirken dann wie ein Namensraum.
6
© 2006 Dagmar Walddobler
C# Gültigkeitsbereich: Namespace
Verschachtelung von Namensräumen
Namensräume können auch verschachtelt werden. Die Bezeichner des übergeordneten und
des untergeordneten Namensraums werden dann mit einem Punkt getrennt.
1.Möglichkeit:
namespace Figuren
{
//Hier die Deklarationen für Figuren
namespace Zweidim
{
//Hier die Deklarationen für Figuren.Zweidim
}
}
7
© 2006 Dagmar Walddobler
C# Gültigkeitsbereich: Namespace
Verwenden von Namensräumen
Die erste Möglichkeit besteht darin, den Bezeichner des Namensraums vor den Bezeichner
der Klasse zu schreiben und beide mit einem Punkt zu trennen:
Figuren.CSomeClass.fkt();
Die zweite Möglichkeit ist die, den gesamten Namensraum einzubinden, wodurch der
Zugriff auf alle darin enthaltenen Klassen ohne explizite Angabe des NamensraumBezeichners möglich ist.
Dies wird bewirkt durch das reservierte Wort using, (normalerweise am Anfang eines
Programms bzw. einer Datei):
using Figuren;
using Figuren.Zweidim;
CSomeClass.fkt();
Deklariert man keinen eigenen Namensraum, sind alle Klassen im so genannten
globalen Namensraum deklariert. Dieser ist stets vorhanden. Bei größeren
Applikationen ist es jedoch sinnvoll, eigene Namensräume zu deklarieren.
8
© 2006 Dagmar Walddobler
C# Gültigkeitsbereich: Namespace
File: XXX.cs
}
namespace A {
... Classes ...
... Interfaces ...
... Structs ...
... Enums ...
... Delegates ...
namespace B {
...
}
// voller Name: A.B
File: YYY.cs
}
namespace A {
...
namespace B {...}
namespace C {...}
Gleichnamige Namespaces in verschiedenen Dateien bilden gemeinsamen Deklarationsraum
Eingeschachtelte Namespaces bilden eigenen Deklarationsraum
9
© 2006 Dagmar Walddobler
C# Benutzung fremder Namespaces
Color.cs
Figures.cs
namespace Util {
public enum Color {...}
Triangle.cs
namespace Util.Figures {
public class Rect {...}
public class Circle {...}
}
}
using Util.Figures;
}
class Test {
Rect r;
Triangle t;
Util. Color c;
// Benutzung ohne Qualifikation (weil using Util.Figures)
// Benutzung mit Qualifikation
Fremde Namespaces müssen entweder
• mit using importiert oder
• als Qualifikation vor verwendeten Namen geschrieben werden
Fast jedes Programm benötigt Namespace System  using System;
10
© 2006 Dagmar Walddobler
namespace Util.Figures {
public class Triangle {...}
}
C# Namespaces vs Java-Pakete (Teil 1)
C#
Datei kann mehrere Namespaces enthalten
xxx.cs
Java
Datei kann nur 1 Paketangabe enthalten
xxx.java
namespace A {...}
namespace B {...}
namespace C {...}
Namespaces werden nicht auf
Verzeichnisse abgebildet
xxx.cs
package A;
...
...
Pakete werden auf Verzeichnisse
abgebildet
C.java
namespace A {
class C {...}
package A;
class C {...}
}
Samples
Samples
xxx.cs
A
C.java
11
© 2006 Dagmar Walddobler
C# Namespaces vs Java-Pakete (Teil 2)
C#
Es werden
Namespaces
Java
importiert
Es werden
using System;
NS werden in andere NS importiert
Klassen
importiert
import java.util.LinkedList;
import java.awt.*;
Klassen werden in Dateien importiert
namespace A {
using C;
// gilt nur in dieser Datei
import java.util.LinkedList;
}
namespace B {
using D;
}
Alias-Namen möglich
Java kennt Sichtbarkeit innerhalb Paket
using F = System.Windows.Forms;
...
F.Button b;
package A;
class C {
void f() {...}
// package
}
C# kennt Sichtbarkeit in Assembly (!= Namespace)
12
© 2006 Dagmar Walddobler
Herunterladen