Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Importdeklarationen: Das
Eine Importdeklaration gibt ein Modul oder einen Namespace an, auf dessen Elemente Sie verweisen können, ohne einen vollqualifizierten Namen zu verwenden.
Syntax
open module-or-namespace-name
open type type-name
Bemerkungen
Beim Verweisen auf Code mithilfe des vollqualifizierten Namespaces oder Modulpfads kann jedes Mal Code erstellt werden, der schwer zu schreiben, zu lesen und zu verwalten ist. Stattdessen können Sie das open Schlüsselwort für häufig verwendete Module und Namespaces verwenden, damit Sie beim Verweisen auf ein Element dieses Moduls oder Namespaces anstelle des vollqualifizierten Namens die kurzform des Namens verwenden können. Dieses Schlüsselwort ähnelt dem using Schlüsselwort in C#, using namespace in Visual C++ und Imports in Visual Basic.
Das bereitgestellte Modul oder Namespace muss sich im selben Projekt oder in einem referenzierten Projekt oder in einer Assembly befinden. Andernfalls können Sie einen Verweis auf das Projekt hinzufügen oder die -reference Befehlszeilenoption (oder die Abkürzung) -rverwenden. Weitere Informationen finden Sie unter Compileroptionen.
Die Importdeklaration stellt die Namen im Code zur Verfügung, der auf die Deklaration folgt, bis zum Ende des eingeschlossenen Namespaces, Moduls oder der Datei.
Wenn Sie mehrere Importdeklarationen verwenden, sollten sie in separaten Zeilen angezeigt werden.
Der folgende Code zeigt die Verwendung des open Schlüsselworts zur Vereinfachung von Code.
// Without the import declaration, you must include the full
// path to .NET Framework namespaces such as System.IO.
let writeToFile1 filename (text: string) =
let stream1 = new System.IO.FileStream(filename, System.IO.FileMode.Create)
let writer = new System.IO.StreamWriter(stream1)
writer.WriteLine(text)
// Open a .NET Framework namespace.
open System.IO
// Now you do not have to include the full paths.
let writeToFile2 filename (text: string) =
let stream1 = new FileStream(filename, FileMode.Create)
let writer = new StreamWriter(stream1)
writer.WriteLine(text)
writeToFile2 "file1.txt" "Testing..."
Der F#-Compiler gibt keinen Fehler oder eine Warnung aus, wenn Mehrdeutigkeiten auftreten, wenn derselbe Name in mehreren geöffneten Modulen oder Namespaces auftritt. Wenn Mehrdeutigkeiten auftreten, bevorzugt F# das zuletzt geöffnete Modul oder den Namespace. Im folgenden Code beispielsweise bedeutet dies empty , auch wenn empty sie sich sowohl in den Modulen Seq als auch in den List Modulen Seq.emptybefindet.
open List
open Seq
printfn %"{empty}"
Seien Sie daher vorsichtig, wenn Sie Module oder Namespaces öffnen, z ListSeq . B. Elemente enthalten, die identische Namen enthalten. Verwenden Sie stattdessen die qualifizierten Namen. Sie sollten jede Situation vermeiden, in der der Code von der Reihenfolge der Importdeklarationen abhängig ist.
Offene Typdeklarationen
F# unterstützt open für einen Typ wie folgt:
open type System.Math
PI
Dadurch werden alle barrierefreien statischen Felder und Member für den Typ verfügbar gemacht.
Sie können auch open F#-definierte Datensatz - und diskriminierte Union-Typen verfügbar machen, um statische Member verfügbar zu machen. Im Falle diskriminierter Gewerkschaften können Sie auch die Unionsfälle offenlegen. Dies kann hilfreich für den Zugriff auf Union-Fälle in einem Typ sein, der innerhalb eines Moduls deklariert ist, das Sie möglicherweise nicht öffnen möchten, z. B.:
module M =
type DU = A | B | C
let someOtherFunction x = x + 1
// Open only the type inside the module
open type M.DU
printfn "%A" A
Nur mit global Bezeichner aus dem Stammpfad öffnen
Geschachtelte Module wie
module A =
module B =
...
kann über
open A // opens A
open B // opens A.B
So öffnen Sie nur vollqualifizierte Module oder Namespaces präfixen sie mit dem global Bezeichner:
open global.A // works
open global.B // this now fails
open global.A.B // works
Standardmäßig geöffnete Namespaces
Einige Namespaces werden so häufig in F#-Code verwendet, dass sie implizit geöffnet werden, ohne dass eine explizite Importdeklaration erforderlich ist. Die folgende Tabelle zeigt die standardmäßig geöffneten Namespaces.
| Namespace | BESCHREIBUNG |
|---|---|
FSharp.Core |
Enthält grundlegende F#-Typdefinitionen für integrierte Typen wie int und float. |
FSharp.Core.Operators |
Enthält grundlegende arithmetische Vorgänge wie + und *. |
FSharp.Collections |
Enthält unveränderliche Auflistungsklassen wie List und Array. |
FSharp.Control |
Enthält Typen für Steuerelementkonstrukte wie faule Auswertung und asynchrone Ausdrücke. |
FSharp.Text |
Enthält Funktionen für formatierte E/A-Funktionen, z. B. die printf Funktion. |
AutoOpen-Attribut
Sie können das AutoOpen Attribut auf eine Assembly anwenden, wenn Sie automatisch einen Namespace oder ein Modul öffnen möchten, wenn auf die Assembly verwiesen wird. Sie können das AutoOpen Attribut auch auf ein Modul anwenden, um dieses Modul automatisch zu öffnen, wenn das übergeordnete Modul oder der Namespace geöffnet wird. Weitere Informationen finden Sie unter AutoOpenAttribute.
RequireQualifiedAccess-Attribut
Einige Module, Datensätze oder Union-Typen können das RequireQualifiedAccess Attribut angeben. Wenn Sie auf Elemente dieser Module, Datensätze oder Vereinigungen verweisen, müssen Sie unabhängig davon, ob Sie eine Importdeklaration einschließen, einen qualifizierten Namen verwenden. Wenn Sie dieses Attribut strategisch für Typen verwenden, die häufig verwendete Namen definieren, vermeiden Sie Namenskonflikte und machen Code dadurch widerstandsfähiger gegenüber Änderungen in Bibliotheken. Weitere Informationen finden Sie unter RequireQualifiedAccessAttribute.