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