Declaraties importeren: het open
trefwoord
Met een importdeclaratie wordt een module of naamruimte opgegeven waarvan u naar de elementen kunt verwijzen zonder een volledig gekwalificeerde naam te gebruiken.
Syntaxis
open module-or-namespace-name
open type type-name
Opmerkingen
Telkens wanneer u naar code verwijst met behulp van de volledig gekwalificeerde naamruimte of het modulepad, kan code worden gemaakt die moeilijk te schrijven, lezen en onderhouden is. In plaats daarvan kunt u het open
trefwoord gebruiken voor veelgebruikte modules en naamruimten, zodat u, wanneer u naar een lid van die module of naamruimte verwijst, de korte vorm van de naam kunt gebruiken in plaats van de volledig gekwalificeerde naam. Dit trefwoord is vergelijkbaar met het using
trefwoord in C#, using namespace
in Visual C++ en Imports
in Visual Basic.
De opgegeven module of naamruimte moet zich in hetzelfde project of in een project of assembly bevinden waarnaar wordt verwezen. Als dat niet het is, kunt u een verwijzing naar het project toevoegen of de opdrachtregeloptie (of de -reference
afkorting ervan) -r
gebruiken. Zie Compileropties voor meer informatie.
De importdeclaratie maakt de namen beschikbaar in de code die volgt op de declaratie, tot aan het einde van de ingesloten naamruimte, module of bestand.
Wanneer u meerdere importdeclaraties gebruikt, worden deze weergegeven op afzonderlijke regels.
De volgende code toont het gebruik van het open
trefwoord om code te vereenvoudigen.
// 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..."
De F#-compiler verzendt geen fout of waarschuwing wanneer er dubbelzinnigheden optreden wanneer dezelfde naam voorkomt in meer dan één geopende module of naamruimte. Wanneer er dubbelzinnigheden optreden, geeft F# voorkeur aan de recent geopende module of naamruimte. In de volgende code betekent dit Seq.empty
bijvoorbeeld, empty
ook al empty
bevinden ze zich in zowel de als Seq
de List
modules.
open List
open Seq
printfn %"{empty}"
Wees daarom voorzichtig wanneer u modules of naamruimten opent, zoals List
of Seq
die leden bevatten die identieke namen hebben. In plaats daarvan kunt u overwegen de gekwalificeerde namen te gebruiken. Vermijd eventuele situaties waarin de code afhankelijk is van de volgorde van de importdeclaraties.
Declaraties van open type
F# ondersteunt open
een type als volgt:
open type System.Math
PI
Hiermee worden alle toegankelijke statische velden en leden van het type weergegeven.
U kunt ook open
F#-gedefinieerde record - en gediscrimineerde samenvoegingstypen gebruiken om statische leden beschikbaar te maken. In het geval van gediscrimineerde vakbonden kunt u ook de union cases blootstellen. Dit kan handig zijn voor het openen van samenvoegcases in een type dat is gedeclareerd in een module die u mogelijk niet wilt openen, zoals:
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
Openen vanuit hoofdpad alleen met global
aanduiding
Geneste modules zoals
module A =
module B =
...
kan worden geopend via
open A // opens A
open B // opens A.B
Als u alleen volledig gekwalificeerde modules of naamruimten wilt openen, worden ze voorafgegaan door de global
aanduiding:
open global.A // works
open global.B // this now fails
open global.A.B // works
Naamruimten die standaard zijn geopend
Sommige naamruimten worden zo vaak gebruikt in F#-code dat ze impliciet worden geopend zonder dat er een expliciete importdeclaratie nodig is. In de volgende tabel ziet u de naamruimten die standaard zijn geopend.
Naamruimte | Beschrijving |
---|---|
FSharp.Core |
Bevat eenvoudige F#-typedefinities voor ingebouwde typen, zoals int en float . |
FSharp.Core.Operators |
Bevat eenvoudige rekenkundige bewerkingen zoals + en * . |
FSharp.Collections |
Bevat onveranderbare verzamelingsklassen zoals List en Array . |
FSharp.Control |
Bevat typen voor besturingsconstructies, zoals luie evaluatie en asynchrone expressies. |
FSharp.Text |
Bevat functies voor opgemaakte IO, zoals de printf functie. |
Kenmerk AutoOpen
U kunt het AutoOpen
kenmerk toepassen op een assembly als u automatisch een naamruimte of module wilt openen wanneer naar de assembly wordt verwezen. U kunt het AutoOpen
kenmerk ook toepassen op een module om die module automatisch te openen wanneer de bovenliggende module of naamruimte wordt geopend. Zie AutoOpenAttribute voor meer informatie.
Kenmerk RequireQualifiedAccess
Sommige modules, records of samenvoegtypen kunnen het RequireQualifiedAccess
kenmerk opgeven. Wanneer u naar elementen van deze modules, records of samenvoegingen verwijst, moet u een gekwalificeerde naam gebruiken, ongeacht of u een importdeclaratie opneemt. Als u dit kenmerk strategisch gebruikt voor typen die veelgebruikte namen definiëren, helpt u naamconflicten te voorkomen en zo code toleranter te maken voor wijzigingen in bibliotheken. Zie RequireQualifiedAccessAttribute voor meer informatie.