Namespaces

Auf der obersten Ebene besteht ein Q#-Programm aus einer Reihe von Namespaces. Abgesehen von Kommentaren sind Namespaces die einzigen Elemente der obersten Ebene in einem Q#-Programm, und alle anderen Elemente müssen sich in einem Namespace befinden. Jede Datei kann null oder mehr Namespaces enthalten, und jeder Namespace kann mehrere Dateien umfassen. Q#unterstützt keine geschachtelten Namespaces.

Ein Namespace-Block besteht aus dem Schlüsselwort namespace, gefolgt vom Namespacenamen und dem Inhalt des Blocks in geschweiften Klammern { }. Namespace-Namen bestehen aus einer Sequenz von einem oder mehreren rechtlichen Symbolen, die durch einen Punkt (.) getrennt sind. Namespace-Namen können aus Gründen der besseren Lesbarkeit Punkte enthalten, Q# unterstützen jedoch keine relativen Verweise auf Namespaces. Beispielsweise sind zwei Namespaces Foo und Foo.Bar nicht verknüpft, und es gibt kein Konzept einer Hierarchie. Insbesondere ist es für eine Baz-Funktion, die in Foo.Bar definiert ist, nicht möglich, Foo über Bar.Baz zu öffnen und dann auf diese Funktion zuzugreifen.

Namespaceblöcke können offene Anweisungen sowie Vorgangs-, Funktions- und Typdeklarationen enthalten. Diese können in beliebiger Reihenfolge auftreten und sind standardmäßig rekursiv, was bedeutet, dass sie in beliebiger Reihenfolge deklariert und verwendet werden und sich selbst aufrufen können. es ist nicht erforderlich, dass die Deklaration eines Typs oder aufrufbar vor der Verwendung steht.

Offene Anweisungen

Standardmäßig kann ohne weitere Qualifizierung auf alle im selben Namespace deklarierten Daten zugegriffen werden. Deklarationen in einem anderen Namespace können jedoch nur verwendet werden, indem sie ihren Namen mit dem Namen des Namespace qualifizieren, zu dem sie gehören, oder indem sie diesen Namespace öffnen, bevor er verwendet wird, wie im folgenden Beispiel gezeigt.

namespace Microsoft.Quantum.Samples {
    
    open Microsoft.Quantum.Arithmetic; 
    open Microsoft.Quantum.Arrays as Array; 

    // ...
}

Im Beispiel wird eine open-Anweisung verwendet, um alle Typen und Aufrufbaren zu importieren, die im Microsoft.Quantum.Artithmetic-Namespace deklariert sind. Auf sie kann dann mit ihrem nicht qualifizierten Namen verwiesen werden, es sei denn, dieser Name weist einen Konflikt mit einer Deklaration im Namespace-Block oder einem anderen geöffneten Namespace auf.

Um zu vermeiden, den vollständigen Namen einzugeben und gleichzeitig zu unterscheiden, woher bestimmte Elemente stammen, können Sie für einen bestimmten Namespace einen alternativen Namen oder Alias definieren, der normalerweise kürzer ist. In diesem Fall können alle typen und aufrufbaren Typen, die in diesem Namespace deklariert sind, stattdessen durch den definierten Kurznamen qualifiziert werden. Im vorherigen Beispiel ist dies der Fall für den Microsoft.Quantum.Arrays-Namespace. Eine in deklarierte IndexRange-Funktion in Microsoft.Quantum.Arrays kann dann z. B. über Array.IndexRange innerhalb dieses Namespace-Blocks verwendet werden.

Unabhängig davon, ob Sie einen Namespace öffnen oder einen Alias definieren, open sind Anweisungen nur für den gesamten Namespaceteil in dieser Datei gültig.