heim - Internet-Setup
Klassen und Namespaces. Klassen und Namespaces, die Namespaces verwenden und deklarieren

Klassen und Namespaces

.NET Framework-Klassen

Der vielleicht größte Vorteil beim Schreiben von verwaltetem Code besteht – zumindest aus der Sicht eines Entwicklers – darin, dass Sie ihn nutzen können .NET-Basisklassenbibliothek .

Die .NET-Kernklassen bieten eine riesige Sammlung verwalteter Codeklassen, mit denen Sie nahezu jedes Problem lösen können, das zuvor mit der Windows-API gelöst werden konnte. Alle diese Klassen folgen demselben IL-Objektmodell mit Einzelvererbung. Das bedeutet, dass Sie entweder Objekte aus einer der .NET-Basisklassen erstellen oder Ihre eigenen Klassen von ihnen erben können.

Der Unterschied zwischen den .NET-Basisklassen besteht darin, dass sie intuitiv und einfach zu verwenden sind. Um beispielsweise einen Thread zu starten, müssen Sie die Start()-Methode der Klasse aufrufen Faden. Um ein TextBox-Objekt nicht verfügbar zu machen, legen Sie die Enabled-Eigenschaft des Objekts auf „false“ fest. Dieser Ansatz, der Visual Basic- und Java-Entwicklern bekannt ist, deren Bibliotheken ebenso einfach zu verwenden sind, wird eine große Erleichterung für C++-Entwickler sein, die jahrelang mit API-Funktionen wie GetDIBits(), RegisterWndClassEx() und IsEqualIID() usw. zu kämpfen hatten sowie viele Funktionen, die die Übergabe von Fensterhandles erforderten.

Allerdings hatten C++-Entwickler schon immer einfachen Zugriff auf den gesamten Satz von Windows-APIs, während Visual Basic 6- und Java-Entwickler auf die Kernfunktionen des Betriebssystems beschränkt waren, auf die sie über ihre Sprachen zugreifen konnten. Die .NET-Basisklassen kombinieren die Benutzerfreundlichkeit der Visual Basic- und Java-Bibliotheken mit einer relativ vollständigen Abdeckung des Windows-API-Funktionssatzes. Auf viele Windows-Funktionen kann nicht über Basisklassen zugegriffen werden. In diesen Fällen müssen Sie auf API-Funktionen zurückgreifen. Im Allgemeinen gilt dies jedoch nur für die exotischsten Funktionen. Für den täglichen Gebrauch reicht im Allgemeinen eine Reihe von Basisklassen aus. Wenn Sie jedoch eine API-Funktion aufrufen müssen, bietet .NET die sogenannte Plattformaufrufmechanismus, was eine korrekte Datentypkonvertierung garantiert, sodass diese Aufgabe jetzt nicht schwieriger ist, als diese Funktionen direkt aus C++-Code aufzurufen, unabhängig davon, in welcher Sprache der Code geschrieben ist – C#, C++ oder Visual Basic 2010.

Namensräume

Namensräume ist eine Möglichkeit, mit der .NET Namenskonflikte zwischen Klassen vermeidet. Sie sollen Situationen verhindern, in denen Sie eine Klasse definieren, die einen Kunden darstellt, sie Kunde nennen und dann jemand anderes dasselbe tut (dies ist ein ziemlich häufiges Szenario).

Ein Namespace ist nichts anderes als eine Gruppe von Datentypen, hat aber den Effekt, dass den Namen aller Datentypen innerhalb des Namespace automatisch der Namespace-Name vorangestellt wird. Namensräume können ineinander verschachtelt sein. Beispielsweise sind die meisten allgemeinen .NET-Basisklassen im Namespace zu finden System. Basisklasse Array bezieht sich auf diesen Raum, daher lautet sein vollständiger Name System.Array.

Die .NET-Plattform erfordert, dass alle Namen innerhalb eines Namespace deklariert werden; Sie können zum Beispiel Ihre Klasse angeben Meine Klasse zum Namensraum Meine Firma. Dann sieht der vollständige Name dieser Klasse so aus MyCompany.MyClass.

Beachten Sie, dass der Typ dem unbenannten globalen Namespace hinzugefügt wird, wenn ein Namespace nicht explizit angegeben wird.

In den meisten Situationen empfiehlt Microsoft die Verwendung von mindestens zwei verschachtelten Namespaces: Der erste ist der Name Ihres Unternehmens und der zweite ist der Name der Technologie oder des Softwarepakets, zu dem die Klasse gehört. Das sieht also etwa so aus: MyCompany.SomeNamespace .Meine Klasse. In den meisten Fällen schützt dieser Ansatz die Klassen Ihrer Anwendung vor möglichen Konflikten mit Klassennamen, die von Entwicklern anderer Unternehmen geschrieben wurden.

Die folgende Tabelle ist eine kurze Liste einiger (aber sicherlich nicht aller) in .NET angebotenen Namespaces, die je nach Funktionalität in Gruppen unterteilt wurden:

.NET Framework-Schlüsselnamespaces
Namespace in .NET Beschreibung
System Innerhalb des Namespace System enthält viele nützliche Typen für den Umgang mit internen Daten, Mathematik, Zufallszahlengenerierung, Umgebungsvariablen und Speicherbereinigung sowie eine Reihe häufig verwendeter Ausnahmen und Attribute
System.Collections
System.Collections.Generic
Diese Namespaces enthalten eine Reihe von Containertypen sowie mehrere Basistypen und Schnittstellen, mit denen Sie spezielle Sammlungen erstellen können
Systemdaten
System.Data.Common
System.Data.EntityClient
System.Data.SqlClient
Diese Namespaces werden für die Interaktion mit Datenbanken über ADO.NET verwendet
System.IO
System.IO.Compression
System.IO.Ports
Diese Räume enthalten viele Typen, die für Datei-E/A, Datenkomprimierung und Portmanipulation konzipiert sind.
System.Reflexion
System.Reflection.Emit
Diese Namespaces enthalten Typen, die die Typerkennung zur Laufzeit sowie die dynamische Typerstellung unterstützen
System.Runtime.InteropServices Dieser Namespace enthält die Mittel, mit denen Sie .NET-Typen die Interaktion mit „nicht verwaltetem Code“ (z. B. C-basierten DLLs und COM-Servern) und umgekehrt ermöglichen können
System.Zeichnung
System.Windows.Forms
Diese Namespaces enthalten Typen, die zum Erstellen von Desktopanwendungen mithilfe des nativen .NET-Grafik-Toolsets (Windows Forms) verwendet werden.
System.Windows
System.Windows.Controls
System.Windows.Shapes
Raum System.Windows ist der Stamm unter diesen mehreren Namespaces, die eine Reihe grafischer Windows Presentation Foundation (WPF)-Tools darstellen
System.Linq
System.Xml.Linq
System.Data.DataSetExtensions
Diese Namespaces enthalten Typen, die beim Programmieren mit der LINQ-API verwendet werden
System.Web Dieser Namespace ist einer von vielen, mit denen Sie ASP.NET-Webanwendungen erstellen können
System.ServiceModel Dieser Namespace ist einer von vielen, die Sie zum Erstellen verteilter Anwendungen mithilfe der Windows Communication Foundation (WCF)-API verwenden können.
System.Workflow.Runtime
System.Workflow.Aktivitäten
Diese beiden Namespaces sind die Hauptvertreter der vielen Namespaces, die die Typen enthalten, die zum Erstellen von Workflow-fähigen Anwendungen mithilfe der Windows Workflow Foundation (WWF)-API verwendet werden.
System.Threading
System.Threading.Aufgaben
Dieser Namespace enthält zahlreiche Typen zum Erstellen von Multithread-Anwendungen, die die Arbeitslast auf mehrere CPUs verteilen können.
Systemsicherheit Sicherheit gehört zur .NET-Welt. Sicherheitsbezogene Namespaces enthalten viele Typen, die sich mit Berechtigungen, kryptografischer Sicherheit usw. befassen.
System.Xml Dieser XML-orientierte Namespace enthält zahlreiche Typen, die zur Interaktion mit XML-Daten verwendet werden können

Die Rolle des Microsoft-Rootspace

Bei der Untersuchung der Liste in der Tabelle fiel schnell auf, dass der System-Namespace die Wurzel einer beträchtlichen Anzahl verschachtelter Namespaces ist (z. B. System.IO, System.Data usw.). Wie sich jedoch herausstellt, bietet die Basisklassenbibliothek neben System auch eine Reihe anderer Root-Namespaces der obersten Ebene, von denen der nützlichste ist Microsoft-Namespace.

Bei der Beantwortung der Frage, was die Verwendung des Namensraums „std“ bedeutet, ist zunächst zu beachten, dass der aus dem Englischen übersetzte Begriff „Namensraum“ bedeutet, also den Umfang der Deklaration, der zur Definition verschiedener Identifikationsformen erforderlich ist: Funktionen und abhängige/unabhängige Variablen.

Dadurch gibt es keinen Konflikt zwischen Namen, da es Situationen gibt, in denen mehrere Variablen die gleichen Werte annehmen. Dies geschieht normalerweise, wenn verschiedene Bibliotheken erstellt werden.

Bezeichner sind im Verhältnis zueinander frei verfügbar. Bei Verwendung des vollständigen Namensformats erhalten sie freien Zugang zu unabhängigen Mitgliedern.

Dafür ist es äußerst wichtig sodass das Objekt die vollständige Form des Namens unter Verwendung des Namespace std enthält. Dies ist wichtig, um visuell zu verstehen, wie die Deklaration aussieht, wenn sie im Space-Namen platziert wird.

Das Bild zeigt verschiedene Variationen des Zugriffs auf Kodierungen, innerhalb und außerhalb seiner Zäune gelegen:

1 So sieht es aus Vollständiger Name:

2 Um eine bestehende Anzeige zu ergänzen, hinzufügen mit:

3 Um alle vorhandenen IDs hinzuzufügen, Verwenden Sie die entsprechende Anweisung:

Direktive verwenden

Die using-Direktive ermöglicht die Nutzung aller verfügbaren Namen, die im Namespace enthalten sind.

Es ist nicht erforderlich, einen Qualifizierer anzugeben.

Sie müssen using in einer Datei im CPP-Format verwenden. Eine wichtige Voraussetzung ist jedoch das Vorhandensein mehrerer Identifikatoren.

Wenn es nur wenige Namen gibt, ist es sinnvoll, einen gewöhnlichen Namen zu erstellen.

Dann können Sie nur die notwendigen Bezeichner hinzufügen und den Rest in Ruhe lassen.

Es ist wichtig zu beachten, dass, wenn der Name der lokalen Variablen und der Hauptvariable übereinstimmen, in diesem Fall die erste im verborgenen Zugriff ist.

Bitte beachten Sie, dass das Erstellen von Variablen mit demselben Namen illegal ist.

Beratung! Zur Vereinfachung der Verwendung kann die using-Anweisung oben in der cpp.-Formatdatei oder umgekehrt in der erstellten Bibliothek platziert werden.

Um die angenehmsten Arbeitsbedingungen für Sie zu gewährleisten, können Sie an der Platzierung der erforderlichen Dateien arbeiten.

Sofern nicht unbedingt erforderlich, sollte die using-Direktive nicht platziert werden in Headern in einer Datei im H-Format.

Dies liegt daran, dass mit dieser Aktion alle Identifikatoren im Sichtbarkeitsbereich aktiv werden, was die Wahrscheinlichkeit eines Konflikts zwischen einigen Namen erhöht.

Für Dateien ist es am besten, den vollständigen Namen zu verwenden.

Für den Fall, dass sie zu lang werden, können Sie Abkürzungen in Form von Aliasen verwenden.

Namespace-Deklarationen

Es ist üblich, Werbung in Form von Dateinamen zu schalten. Für den Fall, dass sich die Ausführung bestimmter Funktionen in einer separaten Bibliothek oder Datei befindet, ist es wichtig, den vollständigen Namen zu ermitteln.

Es lohnt sich zu verstehen, um welche Maßnahmen es sich handelt Schauen Sie sich das folgende Bild an:

Um die Contosodata-Funktion „cpp. format“ zu implementieren, ist es auch wichtig, den vollständigen Namen in der Groß-/Kleinschreibung zu verwenden wenn die Direktive ganz am Anfang steht:

Verwenden des Namespace std. kann Werbung in mehreren Abschnitten gleichzeitig enthalten, die sich in derselben Datei befinden.

Durch den Compiler werden alle Elemente während der Datenverarbeitung zusammengeführt.

So wird beispielsweise std. in der Regel in allen Headern zugänglicher Dateien deklariert, die sich in zugänglichen Bibliotheken eines Standardtyps befinden.

Durch einen vollqualifizierten Namen gekennzeichnete Mitglieder können nicht nur innerhalb des Namensraums definiert werden, sondern auch außerhalb, wenn sie über eine explizite Qualifikation verfügen.

Die Definition muss nach der Deklaration in dem Namensraum stehen, in dem sie erstellt wird.

Achten Sie als visuelles Beispiel auf das folgende Bild:

Am häufigsten tritt dieser Fehler auf, wenn die Definitionsreihenfolge verletzt wird oder die Bestandteile des vollständigen Namens sofort in die verfügbaren Objekte aufgenommen werden.

Wenn Cookies nicht in einem bestimmten Namespace deklariert sind, es gehört formal zum Raum des globalen Typs.

Beratung! Sofern nicht unbedingt erforderlich, wird empfohlen, die Aufnahme von Membern in den globalen Typraum zu vermeiden.

Eine wesentliche Ausnahme von der Regel kann nur sein Hauptoption, was eine obligatorische Einbeziehung in einen riesigen Raum impliziert.

Um einen globalen Typbezeichner zu erstellen, müssen Sie die entsprechende Sichtbarkeitsfunktion in Form eines vollständigen Namens verwenden.

Diese Aktion hilft dabei, eine Unterscheidungseigenschaft eines Bezeichners gegenüber anderen vorhandenen Bezeichnern zu erstellen, die sich in einem anderen Namespace befinden.

Dies wird Ihnen helfen, den Code zu verstehen.

Raumstandard.

Es ist zu beachten, dass Leerzeichen verschachtelt sein können.

Ist eine gewöhnliche Einbettung gemeint, so hat diese unbegrenzten Charakter auf den gesamten Raum.

Apropos übergeordnete Mitglieder: Sie haben eine solche Funktion nicht.

Zur Erweiterung sind Einbauaufsätze erforderlich.

Zur genaueren Definition und zum Verständnis: Achten Sie auf das folgende Bild:

Es kapselt Informationen für die weitere Implementierung und kann auch Teil eines gewöhnlichen verschachtelten Raums sein und als offene Schnittstelle im übergeordneten Raum fungieren.

Vergleiche sind gewöhnliche Anhänge des Standardtyps, integrierte Mitglieder des übergeordneten Namensraums.

Daher können Sie die Suche nach Funktionen verwenden, die eine Überlastung aufweisen und bei denen eine Abhängigkeit der Argumente besteht.

Um ein Beispiel dafür zu sehen, wie die Bindung erfolgt, Es lohnt sich, sich auf das folgende Beispiel zu beziehen:

Das folgende Bild zeigt den Spezialisierungsprozess in der Vorlage für den übergeordneten Bereich. die im temporären Bereich eines integrierten Typs deklariert wird:

Durch die Nutzung eingebauter Räume ist es möglich, verschiedene Versionen der Schnittstelle in Standardbibliotheken zu verwalten.

Es ist möglich, einen einzigen übergeordneten Bereich zu erstellen und jede dargestellte Schnittstelle zu kapseln.

Es muss jedoch das Format eines Anhangs im gemeinsam genutzten übergeordneten Bereich haben.

Anschließend wird der Kundencode automatisch der neuen Kombination zugewiesen.

Benutzer, die mit der alten Version vertraut sind, können diese problemlos weiter verwenden.

Dazu müssen Sie den vollständigen Pfad zum Anhang erstellen.

Um die erste Ankündigung zu organisieren, müssen Sie einen Inline-Schlüssel verwenden.

Schauen wir uns das folgende Beispiel für zwei Schnittstellenoptionen an, bei denen jeweils Platz vorhanden ist. Der Client-Code bietet auch die Möglichkeit, neue Bibliotheken zu nutzen.

Um den Prozess zu visualisieren Kommen wir zum folgenden Bild:

Alle Namen müssen äußerst eindeutig sein, daher erhöht sich ihre Länge erheblich.

Allerdings ist es hier nicht möglich, eine using-Direktive zu verwenden.

Es ist nur möglich, einen Alias ​​für einen Namensraum zu erstellen.

Betrachten Sie in diesem Fall das folgende Beispiel:

Es ist auch möglich, einen gewöhnlichen Raum zu erstellen, diesem wird jedoch kein Alias ​​zugewiesen.

Ein solches territoriales Spektrum wird als anonym bezeichnet.

In der Regel wird es in Situationen verwendet, in denen die Mitglieder in der Deklaration für die Codierung in anderen Objekten unsichtbar sein müssen.

Wenn alle Identifikatoren in der gesamten Struktur sichtbar sind, bleiben sie außerhalb des geschaffenen Raums jedoch unsichtbar.

Es ist nichts wert, dass der Namespace selbst auch außerhalb des Blocks unsichtbar sein wird, daher sollte jeder Benutzer dieses Detail im Voraus zur Kenntnis nehmen.

Typischerweise sind für diejenigen, die mit Visual C++ arbeiten, Kenntnisse erforderlich.

Anhand hochwertiger Beispiele wird es viel einfacher, dieses Thema zu verstehen.

Was ist ein Namespace in C++?

Ein Namespace ist eine Möglichkeit, logisch zusammengehörige Deklarationen unter einem gemeinsamen Namen zu gruppieren.

Beispiel für einen Namensraum:

// @author Subbotin B.P..h" Namespace First ( int a; float b; ) Namespace Second ( int a; float b; ) int _tmain(int argc, _TCHAR* argv) ( first::a = 1; second:: a = 2; first::b = 1,23; second::b = 4,56; printf("\nfirst::a = %d\n", first::a); printf("\nsecond::a = %d \n", second::a); printf("\nfirst::b = %.2f\n", first::b); printf("\nsecond::b = %.2f\n\n", second::b); return 0; )

Wir bekommen:

Im Beispiel werden zwei Namespaces erstellt: erster und zweiter. Beide Räume enthalten die gleichen Variablen. Aber gerade die Tatsache, dass beispielsweise die Variable a zuerst zum Raum gehört, lässt keine Verwechslung mit einer Variablen aus einem anderen Namensraum zu. Dadurch werden Namenskonflikte vermieden.

bedeutet, dass die im ersten Namensraum deklarierte Variable int a verwendet wird. Dies ist ein Beispiel für eine using-Deklaration. Der ::-Operator wird als Scoping-Operator bezeichnet.

Namespaces werden mit dem Schlüsselwort namespace erstellt:

Namespace zuerst ( int a; float b; )

Um alle Namen aus einem Namespace zu verwenden, können Sie die Direktive using namespace verwenden. Beispiel für die Verwendung des Namespace std:

Verwenden des Namensraums std; int _tmain(int argc, _TCHAR* argv) ( cout<<"\n using namespace std \n"<

Durch die Verwendung des Namespace std können Sie Namen aus dem std-Namespace verwenden. std ist der Name der C++-Standardbibliothek.

Wenn wir im letzten Beispiel die Namespace-Verbindungszeichenfolge mit namespace std entfernen, müssen wir den Namespace-Namen explizit angeben:

// @author Subbotin B.P..h" #include int _tmain(int argc, _TCHAR* argv) ( std::cout<<"\n using namespace std \n"<

Der Namespace definiert den Geltungsbereich. Die Beispiele definierten explizit Namespaces. Hier sind weitere Beispiele für Namespaces. Der Bereich innerhalb einer Funktion ist ebenfalls ein Namespace. Der Bereich globaler Variablen ist ebenfalls ein Namespace. Eine Klasse ist auch ein Namespace.

Es ist möglich, einen Namensraum ohne Namen zu erstellen. Beispiel:

// @author Subbotin B.P..h" Namespace ( int a; int b; ) int _tmain(int argc, _TCHAR* argv) ( a = 5; b = 8; printf("\n a = %d\n", a ); printf("\n b = %d\n\n", b); return 0; )

Dies impliziert die Verwendung der using-Namespace-Direktive. Solche Namensräume werden benötigt, um mögliche Namenskonflikte zu vermeiden.

Wenn der Namespace-Name zu lang ist, können Sie einen Namespace-Alias ​​erstellen. Beispiel:

// @author Subbotin B.P..h" Namespace Underground ( int a; int b; ) Namespace ug = Underground; int _tmain(int argc, _TCHAR* argv) ( ug::a = 5; ug::b = 8; printf ("\n ug::a = %d\n", ug::a); printf("\n ug::b = %d\n\n", ug::b); return 0; )

Namensraum ug = Underground;

führt den Alias ​​ug für den Underground-Namespace ein. Als nächstes arbeiten wir mit dem Alias.

Wenn Sie beabsichtigen, nur einen Teil der Namen aus dem Namensraum zu verwenden, können Sie diesen Teil in einem neuen Namensraum auswählen und verwenden. Beispiel:

// @author Subbotin B.P..h" Namespace Underground ( int a; int b; int c; float d; double e; ) Namespace ug ( using Underground::a; Using Underground::b; ) int _tmain(int argc, _TCHAR* argv) ( ug::a = 5; ug::b = 8; printf("\n ug::a = %d\n", ug::a); printf("\n ug::b = %d\n\n", ug::b); return 0; )

Hier gehen wir davon aus, dass wir von den fünf Variablen des Untergrund-Namensraums nur zwei verwenden. Wir erstellen einen neuen Namespace ug, der zwei using-Deklarationen enthält. Als nächstes arbeiten wir mit dem ug-Namespace.

Der Namensraum kann geändert werden, d.h. Fügen Sie neue Anzeigen hinzu. Beispiel:

// @author Subbotin B.P..h" Namespace Underground ( int a; int b; ) Namespace Underground ( float c; ) int _tmain(int argc, _TCHAR* argv) ( Underground::a = 5; Underground::b = 8 ; Underground::c = 1.2; printf("\n Underground::a = %d\n", Underground::a); printf("\n Underground::b = %d\n", Underground::b ); printf("\n Underground::c = %.1f\n\n", Underground::c); return 0; )

Wir bekommen:

Namespaces können verschachtelt werden. Beispiel:

// @author Subbotin B.P..h" Namespace Upper ( int a; int b; Namespace Inner ( float c; ) ) int _tmain(int argc, _TCHAR* argv) ( Upper::a = 5; Upper::b = 8 ; Upper::inner::c = 1.2; printf("\n Upper::a = %d\n", Upper::a); printf("\n Upper::b = %d\n", Upper ::b); printf("\n Upper::inner::c = %.1f\n\n", Upper::inner::c); return 0; )

Wir bekommen:

Im Beispiel enthält der Namespace Upper den Namespace Inner. Beachten Sie, wie auf das interne Namespace-Feld zugegriffen wird:

oberes::inneres::c = 1.2;

Schauen wir uns den globalen Namespace an. Hier wird der Operator:: ohne Angabe des Space-Namens verwendet. Der globale Namensraum enthält globale Deklarationen, einschließlich der entsprechenden using-Direktiven. Beispiel für einen globalen Namensraum:

// @author Subbotin B.P..h" #include Verwenden des Namensraums std; int nVar; int _tmain(int argc, _TCHAR* argv) ( int nAnotherVar = 1; ::nVar = 5; cout<<"\n nAnotherVar = "<

Es ist wichtig, den Unterschied zwischen der Verwendung von Deklarationen und der Verwendung von Anweisungen zu erkennen.
Eine using-Deklaration stellt eine Variable im lokalen Bereich zur Verfügung, d. h. Es erfolgt eine lokale Namensdeklaration. Es gibt zwei Möglichkeiten, eine lokale Variable zu deklarieren: normal oder mithilfe einer using-Deklaration.

Eine using-Direktive stellt alle Namen in einem bestimmten Namespace zur Verfügung, deklariert sie jedoch nicht lokal.

Eine using-Deklaration hat Vorrang vor einer using-Direktive.

Schauen wir uns ein Beispiel an:

// @author Subbotin B.P..h" namespace sbp ( int a; int b; int c; ) int a; int _tmain(int argc, _TCHAR* argv) ( int a; using namespace sbp; a = 1; sbp:: a = 2; ::a = 3; printf("\n a = %d\n", a); printf("\n sbp::a = %d\n", sbp::a); printf(" \n::a = %d\n\n", ::a); return 0; )

Wir bekommen:

Verwenden des Namensraums sbp;

Dies ist eine using-Direktive, die alle Namen im SBP-Namespace verfügbar macht.

Dies funktioniert mit der lokalen Variablen a. Um der Variablen a Werte aus dem Space sbp zuzuweisen, müssen Sie explizit auf sbp verweisen:

Gleiches gilt für die globale Variable a.

Die lokale Variable a schließt globale Variablen mit demselben Namen ab.

Nun ein Beispiel für eine using-Deklaration:

// @author Subbotin B.P..h" Namespace sbp ( int a; int b; int c; ) int a; int _tmain(int argc, _TCHAR* argv) ( int a; a = 1; using sbp::b; b = 2; ::a = 3; printf("\n a = %d\n", a); printf("\n sbp::b = %d\n", sbp::b); printf("\ n::a = %d\n\n", ::a); return 0; )

Wir bekommen:

Dies ist eine using-Deklaration. Hier wird die Variable b lokal aus dem SBP-Namespace deklariert. Nach dieser Ankündigung können Sie folgende Maßnahmen ergreifen:

aber die using-Deklaration für a

würde zu einem Fehler führen, da im Beispiel die lokale Variable a bereits definiert ist.

Wird helfen.
Der Weg zur Namespace-Unterstützung in PHP war steinig. Aber glücklicherweise wurde es in PHP 5.3 zur Sprache hinzugefügt und die Struktur des PHP-Codes hat sich seitdem erheblich verbessert. Aber wie genau sollen wir sie nutzen?

Was sind Namensräume?

„Vergessen Sie nicht den Backslash, wenn Sie den Namespace-Namen als String speichern!“

Stellen Sie sich einen Namensraum als eine Kiste vor, in die Sie alles stecken können: einen Bleistift, ein Lineal, ein Blatt Papier und so weiter. Das sind deine Sachen. Direkt unter Ihrer Kiste befindet sich die Kiste eines anderen, und der Besitzer bewahrt die gleichen Dinge darin auf. Um zu vermeiden, dass die Gegenstände des anderen benutzt werden, beschließen Sie, die Kartons so zu beschriften, dass klar ist, was wem gehört.

Bisher mussten Entwickler in ihren Klassen, Funktionen und Konstanten Unterstrich-Präfixe verwenden, um Code zu trennen. Dies ist gleichbedeutend damit, dass jeder seine Sachen beschriftet und in einer großen Kiste aufbewahrt. Natürlich ist das zumindest eine Art Organisation, aber sie ist sehr ineffektiv.

Namensräume, Hilfe! Sie können dieselbe Funktion, Klasse, Schnittstelle und Definitionskonstante in separaten Namespaces deklarieren, ohne schwerwiegende Fehler zu erhalten. Im Kern sind Namespaces nichts anderes als hierarchisch gekennzeichnete Codeblöcke, die regulären PHP-Code enthalten.

Du nutzt sie!

Es ist wichtig zu verstehen, dass Sie Namespaces indirekt verwenden. Ab PHP 5.3 fallen alle Definitionen, die nicht bereits in benutzerdefinierten Namensräumen deklariert sind, unter den globalen Namensraum.

Der globale Namespace speichert auch alle internen PHP-Definitionen, wie zum Beispiel mysqli_connect() und die Exception-Klasse. Da der globale Namespace keinen eindeutigen identifizierenden Namen hat, wird er am häufigsten als globaler Namespace bezeichnet.

Bitte beachten Sie, dass die Verwendung eines Namespace optional ist.
Ihr PHP-Skript wird ohne sie gut funktionieren und dieses Verhalten wird sich nicht so schnell ändern.

Namespace-Definition

Die Datei, die den Namespace enthält, muss seine Deklaration am Anfang vor jedem anderen Code enthalten. Das Einzige, was vor einem Namespace deklariert werden kann, ist das reservierte Wort „deklarieren“. Der Deklarationsausdruck kann vor einer Namespace-Deklaration stehen, um die Dateikodierung anzugeben.

Namespaces werden mit dem reservierten Wort namespace deklariert. Namespaces folgen denselben Regeln wie andere Bezeichner in PHP. So sollte der Namespace sein Beginnen Sie mit einem Buchstaben oder Unterstrich, gefolgt von einer beliebigen Anzahl von Buchstaben, Zahlen oder Unterstrichen.

Wenn Sie einen Codeblock in einem globalen Bereich definieren möchten, können Sie das Schlüsselwort namespace verwenden, ohne einen Namen hinzuzufügen.

Sie können mehrere Namespaces in einer Datei verwenden.

Sie können denselben Namespace auch für mehrere verschiedene Dateien verwenden; Der Dateiverbindungsprozess führt sie automatisch zusammen. Es gehört zur guten Codierungspraxis, die Anzahl der Namespace-Definitionen auf eine einzelne Datei zu beschränken, so wie Sie es auch bei Klassen tun würden.

Namespaces werden verwendet, um inkonsistente Definitionen zu vermeiden und dem Programmcode mehr Flexibilität und Organisation zu verleihen.

Bitte beachten Sie, dass die geschweiften Klammern völlig optional sind. Tatsächlich macht die Verwendung der Regel „ein Namespace pro Datei“ und das Weglassen der geschweiften Klammern Ihren Code viel sauberer – es ist nicht nötig, verschachtelten Code einzurücken.

Unternamespaces

Namespaces können einer bestimmten Hierarchie folgen, genau wie Verzeichnisse in einem Dateisystem auf einem Computer. Subnamespaces sind äußerst nützlich, um die Struktur eines Projekts zu organisieren. Wenn Ihr Projekt beispielsweise Datenbankzugriff erfordert, können Sie den Datenbank-Ausnahmehandler und den Verbindungshandlercode im Unternamespace des Datenbank-Namespace platzieren.

Aus Flexibilitätsgründen ist es sinnvoll, verschachtelte Namespaces in Unterverzeichnissen zu speichern. Dies hilft bei der Strukturierung des Projekts und erleichtert die Verwendung für Autoloader, die dem PSR-4-Standard folgen, erheblich.

PHP verwendet einen Backslash als Namespace-Trennzeichen.

Interessante Tatsache: Um zu entscheiden, welches Namespace-Trennzeichen verwendet werden soll, wurde im RFC die Möglichkeit in Betracht gezogen, ein Emoticon zu verwenden.

// myproject/database/connection.phpSie können beliebig viele verschachtelte Namespaces verwenden.

Das Definieren eines Subnamespace mit verschachtelten Codeblöcken wird nicht unterstützt. Das folgende Beispiel gibt einen schwerwiegenden Fehler zurück: „Namespace-Deklarationen können nicht verschachtelt werden.“

Aufrufen von Code aus einem Namespace

Wenn Sie eine neue Instanz eines Objekts erstellen, eine Funktion aufrufen oder Konstanten aus verschiedenen Namensräumen verwenden möchten, verwenden Sie einen Backslash. Es gibt drei Arten von Namespace-Namensdefinitionen:
  • Unqualifizierter Name
  • Qualifizierter Name
  • Vollständig qualifizierter Name

Unvollständiger Name

Dies ist der Name einer Klasse, Funktion oder Konstante und enthält keinen Verweis auf einen Namensraum. Für diejenigen, die gerade erst anfangen, mit Namespaces zu arbeiten, ist dies eine gängige Sichtweise.

Vollständiger Name

Auf diese Weise greifen wir auf die Subnamespace-Hierarchie zu; durch einen Backslash getrennt.

Das folgende Beispiel gibt einen schwerwiegenden Fehler zurück: „Schwerwiegender Fehler: Klasse „MyProject\Database\MyProject\FileAccess\Input“ nicht gefunden“, da MyProject\FileAccess\Input für den Namespace, in dem Sie sich befinden, nicht relevant ist.

Absoluter Name

Vollständige und teilweise Namen werden in Bezug auf den Namensraum verwendet, in dem Sie sich gerade befinden. Sie können nur dazu verwendet werden, den Zugriff auf dieser Ebene zu definieren oder tiefer in die Namespace-Hierarchie einzutauchen.

Wenn Sie auf eine Funktion, Klasse oder Konstante zugreifen möchten, die sich auf einer höheren Hierarchieebene befindet, müssen Sie den vollständigen Namen verwenden – einen absoluten Pfad, keinen relativen. Der Aufruf muss mit einem Backslash beginnen. Dadurch weiß PHP, dass dieser Aufruf aus dem globalen Raum erfolgen sollte, anstatt relativ zu Ihrem aktuellen Standort darauf zuzugreifen.

Für PHP-interne Funktionen müssen wir nicht den vollständigen Namen verwenden. Nicht qualifizierte Namen für Funktionen und Konstanten werden im globalen Namensraum definiert, wenn sie nicht im aktuellen Namensraum definiert sind.

Mit diesem Wissen können wir nun interne PHP-Funktionen überladen und trotzdem die ursprüngliche Funktion (oder Konstante) aufrufen.

"; }

Dynamische Anrufe

PHP ist eine dynamische Programmiersprache; Sie können diese Funktionalität also verwenden, um Code aus einem Namespace aufzurufen. Dies ist im Wesentlichen dasselbe wie die Verwendung eines dynamischen Klassennamens oder das Verbinden einer dynamischen Datei mithilfe einer Variablen zum Speichern ihres Namens. Das PHP-Namenstrennzeichen verwendet dieselben Metazeichen in Strings. Vergessen Sie nicht den Backslash, wenn Sie den Namespace-Namen als String speichern!

Namespace-Schlüsselwort

Das Schlüsselwort „namespace“ wird nicht nur zum Definieren eines Namensraums verwendet, es kann auch zum Aufrufen des aktuellen Namensraums verwendet werden, funktional ähnlich dem Schlüsselwort „self“ für Klassen.

__NAMESPACE__-Konstante

So wie das Schlüsselwort self nicht zum Definieren des Namens der aktuellen Klasse verwendet werden kann, kann das Schlüsselwort namespace nicht für den aktuellen Namespace verwendet werden. Deshalb verwenden wir die Konstante __NAMESPACE__

Diese Konstante ist sehr nützlich, wenn Sie mit dem Erlernen eines Namespace beginnen. Es ist auch sehr nützlich zum Debuggen. Da es sich um eine Zeichenfolge handelt, kann sie in Verbindung mit den oben besprochenen dynamischen Codeaufrufen verwendet werden.

Importieren oder erstellen Sie einen Namensalias

Die Verwendung in Namespaces ist nicht erforderlich

Ein wichtiges Merkmal von Namespaces in PHP ist die Möglichkeit, auf einen externen absoluten Namen zu verweisen Pseudonym, oder importieren.

Importe sind ein sehr nützlicher und grundlegender Aspekt von Namespaces. Dies gibt Ihnen die Möglichkeit, externe Pakete wie Bibliotheken zu verwenden, ohne sich über Namenskonflikte Gedanken machen zu müssen. Der Import erfolgt über das Schlüsselwort use. Bei Bedarf können Sie mit dem Schlüsselwort as einen benutzerdefinierten Alias ​​angeben.

Benutzen als

Wie man es benutzt

Ein absoluter Name kann mit einem kürzeren, nicht qualifizierten Namen verknüpft werden, sodass Sie nicht jedes Mal, wenn Sie ihn verwenden möchten, seinen absoluten Namen eingeben müssen. Die Erstellung oder der Import von Alias ​​muss im übergeordneten oder globalen Namespace erfolgen. Der Versuch, dies innerhalb einer Methode oder Funktion zu tun, ist eine ungültige Syntax.

Eine Alternative besteht darin, einen Alias ​​mit einem anderen Namen zu vergeben

Sie können auch globale Klassen wie Exception importieren. Beim Importieren müssen Sie nicht den absoluten Namen angeben.

Beachten Sie, dass für Namen in einem Namespace ein führender Backslash nicht erforderlich ist und dessen Vorhandensein dort nicht empfohlen wird, da importierte Namen absolut sein müssen und nicht relativ zum aktuellen Namespace analysiert werden.

Obwohl der dynamische Namespace-Aufruf unterstützt wird, wird der dynamische Import nicht unterstützt.

Abschluss

Namespaces werden verwendet, um Definitionskonflikte zu vermeiden und dem Programmcode mehr Flexibilität und Organisation zu verleihen. Denken Sie daran, dass Sie nicht verpflichtet sind, Namespaces zu verwenden. Diese Funktion wird in Kombination mit einem objektorientierten Ansatz verwendet. Ich hoffe, Sie denken darüber nach, Ihr (zukünftiges) PHP-Projekt durch die Verwendung eines Namespace auf die nächste Stufe zu heben.

Anmerkung: In diesem Abschnitt wird die Verwendung und Deklaration von Namespaces beschrieben. Die Hauptmerkmale von RDF, XML-Daten, Document Content Description (DCD), Schema für objektorientiertes XML (SOX) und Document Definition Markup Language (DDML, früher bekannt als XSchema) werden angegeben.

Wir haben zuvor einige der Nachteile von DTD-Definitionen beschrieben, sie hängen zusammen:

  1. Die Syntax dieser Definitionen unterscheidet sich von der Syntax von XML (insbesondere der sogenannten erweiterten Backus-Naur-Form, Erweiterte Backus-Naur-Form);
  2. diese Definitionen sind nicht aussagekräftig genug;
  3. Da jeder Benutzer seine eigenen Tags erstellen kann, ist es sehr wahrscheinlich, dass Benutzer dieselben Elementnamen verwenden, um auf verschiedene Dinge zu verweisen. Auch wenn die Bedeutung der Elemente gleich ist, kann ihr möglicher Inhalt je nach Definition variieren. Wir brauchen also eine Möglichkeit, spezifische Verwendungen eines Elements zu definieren, insbesondere wenn wir verschiedene Arten von Vokabularien im selben Dokument mischen. Um das Problem anzugehen, hat das W3C eine Spezifikation namens XML Namespaces veröffentlicht, die es Ihnen ermöglicht, den Kontext eines Elements in einem Namespace zu definieren.
  4. Es gibt Situationen, in denen es notwendig ist, XML-Dokumente aus verschiedenen Quellen zu kombinieren, die unterschiedlichen DTD-Definitionen entsprechen. Diese Situation entsteht beispielsweise bei der Beschreibung einer großen Informationsmenge, wenn einzelne DTDs nicht ausreichen, um die gesamte Menge abzudecken, oder wenn sie schwer verständlich sind. Es kommt auch in E-Commerce-Systemen vor, wenn versucht wird, die Daten Ihres Geschäftspartners mit Ihren zu kombinieren. Es kann auch vorkommen, dass Sie einfach Ihre Einstellungen zu einer vorhandenen DTD hinzufügen müssen, um einige Informationen in einem Standardformat auszutauschen. Leider bietet die XML-Empfehlung keine Möglichkeit, mehrere DTDs in einem einzigen Dokument zu kombinieren, ohne sie zu ändern oder eine neue DTD zu erstellen (unter Verwendung externer Referenzen).

In diesem Kapitel werden die folgenden zwei Konzepte behandelt: Namensraum und XML-Schemas. Mithilfe von Namespaces können XML-Entwickler ein komplexes Problem in kleine Teile zerlegen und mehrere Vokabulare in einem einzigen Dokument kombinieren, um es vollständig zu beschreiben. Mithilfe von Schemata erstellen Wörterbuchdesigner präzisere Definitionen, als dies in DTDs möglich war, und verwenden dabei die XML-Syntax.

Diese beiden Tools helfen bei der Lösung der komplexen Probleme, die bei der Verwendung von XML auftreten. Namespaces und Schemata ermöglichen XML-Designern und Programmierern Folgendes:

  • Vokabeln besser organisieren, um komplexe Probleme zu lösen;
  • Halten starkes Tippen Daten bei Transformationen in und aus XML;
  • Beschreiben Sie Vokabeln präziser und flexibler, als dies mit DTD möglich war.
  • Lesen Sie Wörterbuchregeln in XML und greifen Sie auf deren Definitionen zu, ohne den Parser zu verkomplizieren.

Wörterbücher mischen

Beim Entwerfen eines Wörterbuchs kann es sinnvoll sein, das globale Problem in mehrere Komponenten aufzuteilen. Dies erfordert Möglichkeiten, ein großes Problem in mehrere Vokabulare zu segmentieren. Das eigentliche zu lösende Problem besteht jedoch darin, separate DTDs im Hauptteil eines einzelnen Dokuments zusammenzuführen. Dieses Problem kann auch auftreten, wenn Sie beispielsweise für ein Unternehmen arbeiten, in dem höchstwahrscheinlich bereits eine Reihe von DTD-Definitionen vorhanden sind und deren Verwendung die Arbeit erheblich erleichtern kann, da sie das Problem so beschreiben, wie andere es verstehen. Oft ist es auch sinnvoll, DTD-Definitionen wiederzuverwenden, d. h. Verwendung allgemeiner Konstrukte aus zuvor erstellten DTD-Definitionen. Wenn Sie eine Anwendung entwickeln, die mit der Software eines externen Partners kommunizieren muss, bleibt Ihnen kaum eine andere Wahl, als vorhandene Konzepte wiederzuverwenden. Die bestehenden Definitionen von DTD stellen eine gemeinsame Sprache dar, die gesprochen werden muss, um verstanden zu werden. Wenn ein Konzept bereits existiert, muss man daran arbeiten, es im Sinne dieses Konzepts zu verstehen.

Wenn Sie für Sie nützliche Definitionen aus DTDs anderer Entwickler verwenden oder segmentierte DTDs kombinieren, um ein Dokument zu erstellen, das ein komplexes Problem beschreibt, besteht die Gefahr, dass Sie auf das Problem stoßen, wenn Ihre Dokumente Elemente mit denselben Namen verwenden von Mehrdeutigkeiten und Namenskollisionen.

Das Problem verschärft sich noch, wenn Namensinstanzen aus mehreren DTDs verwendet werden. In diesem Fall wissen wir nicht, auf welches Element sich welche DTD-Definition bezieht. Dieses Problem wohlgeformter Dokumente wird als Mehrdeutigkeit bezeichnet. Darüber hinaus, wenn die Namen aus dem Dokument dies erfordern Gültigkeitsprüfungen, können wir unsere Bewerbung sehr verwirrend machen. Dieses Problem wird Namenskollision genannt.

Namensräume

Namespaces können dem Benutzer auf zwei sehr wichtige Arten helfen. Mit ihrer Hilfe können Sie:

  • Kombinieren Sie Dokumente aus zwei oder mehr Quellen, ohne die Sicherheit zu verlieren, dass das Programm unterscheiden kann, aus welcher Quelle ein Element oder Attribut stammt.
  • Gestatten Sie dem Benutzeragenten nach Möglichkeit Zugriff auf weiteres Material, beispielsweise eine Dokumenttypdefinition (DTD) oder eine andere Beschreibung von Elementen und Attributen.

Ein Namespace ist eine Sammlung bestimmter Werte oder Merkmale, die in XML-Dokumenten als Namen von Elementen oder Attributen verwendet werden können. Namespaces in XML werden durch einen Uniform Resource Identifier (URI) definiert (Sie können die DTD-Adresse auf Ihrem Server als URI verwenden). Dadurch kann jeder Namespace eindeutig sein.

Um Namespaces in einem Dokument, das Elemente aus verschiedenen Quellen kombiniert, effektiv zu nutzen, müssen wir Folgendes definieren:

  • Ein Verweis auf einen URI, der die Verwendung des Elements beschreibt.
  • Ein Alias, der es uns ermöglicht zu verstehen, aus welchem ​​Namensraum unser Element stammt. Dieser Alias ​​hat die Form eines Elementpräfixes (wenn der Alias ​​für ein unbekanntes Book-Element beispielsweise „catalog“ lautet, würde das Element aufgerufen werden ).

Namespaces verwenden und deklarieren

Namespace-Deklaration

Da in verschiedenen Auszeichnungssprachen – XML-Implementierungen – die gleichen Namen von Tags und deren Attributen zu finden sind, die völlig unterschiedliche Bedeutungen haben, ist es notwendig, sie irgendwie unterscheiden zu können. Dazu erhalten die Namen von Tags und Attributen ein kurzes Präfix, das durch einen Doppelpunkt vom Namen getrennt wird. Das Namenspräfix ist mit einem Bezeichner verknüpft, der den Namensraum definiert. Alle Tag- und Attributnamen, deren Präfixe mit demselben Bezeichner verknüpft sind, bilden einen einzigen Namensraum, in dem die Namen eindeutig sein müssen.

Da wir möchten, dass jeder eine Namespace-Deklaration erkennen kann, wenn er sie sieht, reservieren wir dafür ein spezielles Wort. Gemäß der Namespace-Empfehlung lautet das Wort xmlns . Der Wert des Attributs ist ein URI, der den zu verwendenden Namespace angibt. Dies ist oft die DTD-Definitions-URL, aber das muss nicht immer so sein. Das Namespace-Präfix und die Kennung werden durch das xmlns-Attribut wie folgt definiert:

Wie Sie sehen, wurde das Präfix ntb gerade definiert, kann aber bereits im Namen ntb:notebook verwendet werden. In Zukunft wird den Namen von Tags und Attributen, die wir dem Namespace http://some.firm.com/2003/ntbml zuweisen möchten, ntb vorangestellt, zum Beispiel:

Gorelovo

Darüber hinaus können in einem Tag mehrere Namensräume vorkommen. Nachfolgend finden Sie ein Beispiel für das Mischen mehrerer Namespaces:

Das Buchelement stammt aus dem Katalognamensraum und das ISBN-Attribut stammt aus order .

Name zum Beispiel mit Präfix

wird ein erweiterter, qualifizierter oder qualifizierter Name (OName. Qualified Name) genannt. Der nach dem Doppelpunkt geschriebene Teil des Namens wird als lokaler Teil des Namens bezeichnet.

Die Nomenklatur von Webressourcennamen kann verwirrend sein. Uniform Resource Locator ( Uniform Resource Locator, URL) gibt eine Ressource in Bezug auf Zugriffsprotokoll und Netzwerkstandort an. Einheitlicher Ressourcenbezeichner ( Einheitlicher Ressourcenbezeichner, URI) ist ein eindeutiger Name für eine Ressource. Betrachten Sie einen URI einfach als eine eindeutige Zeichenfolge, die einen Namespace identifiziert.

Nach den Regeln von SGML und XML kann ein Doppelpunkt in Namen als gewöhnliches Zeichen verwendet werden, daher ist ein Name mit einem Präfix nur ein Trick; jedes Programm, das den Namespace nicht „kennt“, analysiert das Dokument der qualifizierte Name als gewöhnlicher Name. Daraus folgt insbesondere, dass in Deklaration des Dokumenttyps(Dokumenttypdeklaration) Namenspräfixe können nicht weggelassen werden.

Das xmlns-Attribut kann in jedem XML-Element erscheinen, nicht nur im Stammelement. Das von ihm definierte Präfix kann in dem Element verwendet werden, in das das xmlns-Attribut geschrieben wird, und in allen darin verschachtelten Elementen. Darüber hinaus können in einem Element mehrere Namensräume definiert werden.

In verschachtelten Elementen kann der Namespace überschrieben werden, indem dem Präfix ein anderer Bezeichner zugeordnet wird.

Das Erscheinen eines Tag-Namens ohne Präfix in einem Dokument, das einen Namespace verwendet, bedeutet, dass der Name zum Standard-Namespace gehört.

Ein gut gestaltetes Dokument sollte Namensräume für alle seine Elemente verwenden.

Präfixe, die mit XML-Zeichen beginnen, sind in jedem Fall der XML-Sprache selbst vorbehalten. Das xmlns-Präfix wird verwendet, um ein anderes, definiertes Präfix mit seiner Namespace-ID zu verknüpfen. Das xmlns-Präfix muss nicht definiert werden, es wird durch die Empfehlung „Namespaces in XML“ eingeführt und dort mit der Namespace-ID verknüpft http://www.w3.ori/2000 /xmlns/.

Ein weiteres Präfix, xml, ist in derselben Empfehlung mit dem Bezeichner verknüpft http://www.w3.org/XML/1998/namespace. Es muss auch nicht im XML-Dokument definiert werden. Mit diesen Bezeichnern kann kein anderes Präfix verknüpft werden. „preserve“ weist an, Leerzeichen intakt zu halten. Dies ist für einige Texte wichtig, beispielsweise für Programmcodes. Der Standardwert überlässt Leerzeichen dem Ermessen des Handlers.

Umfang

Namespace-Deklarationen haben einen Gültigkeitsbereich, genau wie Variablendeklarationen in Programmiersprachen. Dies ist wichtig, da Namespaces nicht immer am Anfang eines XML-Dokuments deklariert werden; manchmal werden sie in nachfolgenden Abschnitten deklariert. Eine Namespace-Deklaration gilt für das Element, in dem sie erscheint, sowie für die Nachkommen dieses Elements, auch wenn sie dort nicht explizit definiert ist. Ein Name kann nur dann auf einen Namensraum verweisen, wenn er im Rahmen seiner Deklaration verwendet wird.

Wir müssen jedoch auch Namespace-Bereiche für Elemente mischen, die andernfalls andere Namespaces erben würden. In diesem Zusammenhang werden zwei Arten der Geltungsbereichsdeklaration definiert: Standard und qualifiziert.

Standardumfang

Wie zu erwarten ist, wird es schnell mühsam, jedem Namen in einem Dokument ein Präfix voranzustellen. Tatsächlich können wir durch die Einführung des Konzepts des Namensbereichs eine große Anzahl von Präfixen in unserem Dokument mischen. Wenn wir einen Standard-Namespace definieren, wird davon ausgegangen, dass dieser alle unqualifizierten Namen im Rahmen seiner Deklaration besitzt. Daher gilt der im Stammelement deklarierte Standard-Namespace als Standard für das gesamte Dokument und kann nur durch einen spezifischeren Namespace überschrieben werden, der innerhalb des Dokuments deklariert wird.

Um einen Namespace zum Standard-Namespace für einen Bereich zu machen, lassen Sie einfach die Präfixdeklaration weg.

Wenn ein Präfix deklariert und dann in Verbindung mit einem Namen verwendet wird, gilt der Namensraum als explizit eingerichtet. Um einem Namespace einen unqualifizierten Namen zuzuweisen, müssen Sie einen Standardraum deklarieren, der den unqualifizierten Namen (ohne Präfix) enthält.

Qualifizierter Umfang

Die obige Methode funktioniert gut, wenn Sie Ihre Namespaces klar trennen können. Manchmal ist es jedoch notwendig, einzelne Namen aus externen Namensräumen in ein Dokument aufzunehmen. Anstatt Namespaces für einen gesamten Bereich zu deklarieren, können Sie qualifizierte Namen verwenden. Deklarieren Sie die benötigten Namespaces am Anfang des Dokuments und qualifizieren Sie sie dann am Verwendungsort.



 


Lesen:



Typisierte Programmiersprache Typ oder Formatbezeichner oder Konvertierungszeichen oder Steuerzeichen

Typisierte Programmiersprache Typ oder Formatbezeichner oder Konvertierungszeichen oder Steuerzeichen

Programmiersprache C++ Letzte Aktualisierung: 28.08.2017 Die Programmiersprache C++ ist eine kompilierte Hochsprache...

Arbeitsplan der russischen Post an den Neujahrsfeiertagen. Postarbeit an den Neujahrsfeiertagen

Arbeitsplan der russischen Post an den Neujahrsfeiertagen. Postarbeit an den Neujahrsfeiertagen

Die russische Post hat sich im 21. Jahrhundert zu einer universellen Institution entwickelt, die nicht nur beim Empfang von Briefen und Paketen hilft. Versorgungsleistungen, Renten,...

Tass: Abkürzung Dekodierung

Tass: Abkürzung Dekodierung

Dieser Begriff kommt vom italienischen abbreviatura und dem lateinischen brevis – kurz. In alten Büchern und Manuskripten war dies die Bezeichnung für eine Abkürzung...

Zertifikatsvorlagen leer, laden Sie die Vorlage „Ehrenurkunde“ zum Ausdrucken herunter

Zertifikatsvorlagen leer, laden Sie die Vorlage „Ehrenurkunde“ zum Ausdrucken herunter

Grüße, lieber Leser! Heute erzähle ich Ihnen, wie Sie einen Brief in Word erstellen. Bei meiner Arbeit musste ich eine große Anzahl von ... aufschreiben.

Feed-Bild RSS