Namespaces (F#)

Mit einem Namespace können Sie Code nach Funktionsbereichen organisieren, indem Sie an eine Gruppierung von Programmelementen einen Namen anfügen.

namespace [parent-namespaces.]identifier

Hinweise

Wenn Code in einem Namespace enthalten sein soll, muss die erste Deklaration in der Datei den Namespace deklarieren. Dann ist der Inhalt der gesamten Datei Teil des Namespaces.

Namespaces können Werte und Funktionen nicht direkt enthalten. Stattdessen müssen Werte und Funktionen in Modulen enthalten sein, und Module werden in Namespaces eingeschlossen. Namespaces können Typen und Module enthalten.

Namespaces können explizit mit dem namespace-Schlüsselwort deklariert werden, oder implizit, wenn ein Modul deklariert wird. Verwenden Sie zum expliziten Generieren eines Namespaces das namespace-Schlüsselwort, gefolgt vom Namespacenamen. Im folgenden Beispiel wird eine Codedatei veranschaulicht, die den Namespace Widgets mit einem Typ und einem Modul in dem Namespace deklariert.

namespace Widgets

type MyWidget1 =
    member this.WidgetName = "Widget1"

module WidgetsModule =
    let widgetName = "Widget2"

Wenn sich der gesamte Inhalt der Datei in einem einzigen Modul befindet, können Sie Namespaces auch implizit deklarieren, indem Sie das module-Schlüsselwort verwenden und im vollqualifizierten Modulnamen den neuen Namespacenamen angeben. Im folgenden Beispiel wird eine Codedatei veranschaulicht, die den Namespace Widgets und das Modul WidgetsModule, das eine Funktion enthält, deklariert.

module Widgets.WidgetModule

let widgetFunction x y =
   printfn "%A %A" x y

Der folgende Code entspricht dem vorangehenden Code, jedoch wird für das Modul eine lokale Moduldeklaration verwendet. In diesem Fall muss der Namespace in einer eigenen Zeile angegeben werden.

namespace Widgets

module WidgetModule =

    let widgetFunction x y =
        printfn "%A %A" x y

Wenn in derselben Datei in einem oder mehreren Namespaces mehrere Module erforderlich sind, müssen Sie lokale Moduldeklarationen verwenden. Bei Verwendung von lokalen Moduldeklarationen dürfen Sie in den Moduldeklarationen nicht den qualifizierten Namespace verwenden. Im folgenden Code wird eine Datei veranschaulicht, die eine Namespacedeklaration und zwei lokale Moduldeklarationen enthält. In diesem Fall sind die Module direkt im Namespace enthalten. Es ist kein implizit erstelltes Modul vorhanden, das über den gleichen Namen wie die Datei verfügt. Jeglicher andere Code in der Datei, z. B. eine do-Bindung, befindet sich im Namespace, jedoch nicht in den inneren Modulen. Daher müssen Sie den Modulmember widgetFunction mit dem Modulnamen qualifizieren.

namespace Widgets

module WidgetModule1 =
   let widgetFunction x y =
      printfn "Module1 %A %A" x y
module WidgetModule2 =
   let widgetFunction x y =
      printfn "Module2 %A %A" x y

module useWidgets =

  do
     WidgetModule1.widgetFunction 10 20
     WidgetModule2.widgetFunction 5 6

Die Ausgabe dieses Beispiels lautet wie folgt.

Module1 10 20
Module2 5 6

Weitere Informationen finden Sie unter Module (F#).

Geschachtelte Namespaces

Wenn Sie einen geschachtelten Namespace erstellen, müssen Sie ihn vollständig qualifizieren. Andernfalls erstellen Sie einen neuen Namespace der obersten Ebene. Einzug wird in Namespacedeklarationen ignoriert.

Im folgenden Beispiel wird das Deklarieren eines geschachtelten Namespaces veranschaulicht.

namespace Outer

    // Full name: Outer.MyClass
    type MyClass() =
       member this.X(x) = x + 1

// Fully qualify any nested namespaces.
namespace Outer.Inner

    // Full name: Outer.Inner.MyClass
    type MyClass() =
       member this.Prop1 = "X"

Namespaces in Dateien und Assemblys

Namespaces können mehrere Dateien in einem einzelnen Projekt oder einer einzelnen Kompilierung umfassen. Der Begriff Namespacefragment beschreibt den Teil eines Namespaces, der in einer Datei enthalten ist. Namespaces können auch mehrere Assemblys umfassen. Beispielsweise enthält der System-Namespace das gesamte .NET Framework, das viele Assemblys umfasst und zahlreiche geschachtelte Namespaces enthält.

Global-Namespace

Sie setzen Namen im .NET-Namespace der obersten Ebene mithilfe des vordefinierten Namespaces global ein.

namespace global

type SomeType() =
    member this.SomeMember = 0

Sie können "global" auch verwenden, um auf den .NET-Namespace der obersten Ebene zu verweisen (z. B., um Namenskonflikte mit anderen Namespaces zu lösen).

global.System.Console.WriteLine("Hello World!")

Siehe auch

Referenz

Module (F#)

Weitere Ressourcen

F#-Sprachreferenz