Delen via


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) -rgebruiken. 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.emptybijvoorbeeld, 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.

Zie ook