Deklarace importu: Klíčové open
slovo
Deklarace importu určuje modul nebo obor názvů, na který můžete odkazovat bez použití plně kvalifikovaného názvu.
Syntaxe
open module-or-namespace-name
open type type-name
Poznámky
Odkazování na kód pomocí plně kvalifikovaného oboru názvů nebo cesty k modulu může pokaždé vytvořit kód, který se obtížně zapisuje, čte a udržuje. Místo toho můžete použít open
klíčové slovo pro často používané moduly a obory názvů, abyste při odkazování na člena tohoto modulu nebo oboru názvů mohli místo plně kvalifikovaného názvu použít krátký tvar názvu. Toto klíčové slovo je podobné klíčovému slovu using
v jazyce C#, using namespace
v jazyce Visual C++ a Imports
v jazyce Visual Basic.
Zadaný modul nebo obor názvů musí být ve stejném projektu nebo v odkazovaném projektu nebo sestavení. Pokud tomu tak není, můžete přidat odkaz na projekt nebo použít možnost příkazového -reference
řádku (nebo její zkratku -r
). Další informace naleznete v tématu Možnosti kompilátoru.
Deklarace importu zpřístupňuje názvy v kódu, který následuje za deklaraci, až do konce ohraničujícího oboru názvů, modulu nebo souboru.
Pokud použijete více deklarací importu, měly by se zobrazit na samostatných řádcích.
Následující kód ukazuje použití klíčového open
slova ke zjednodušení kódu.
// 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..."
Kompilátor jazyka F# nevygeneruje chybu nebo upozornění, pokud dojde k nejednoznačnosti v případě, že stejný název nastane ve více než jednom otevřeném modulu nebo oboru názvů. Když dojde k nejednoznačnostem, dává jazyk F# přednost nedávno otevřenému modulu nebo oboru názvů. Například v následujícím kódu znamená , empty
i když empty
se nachází v obou modulechList
.Seq
Seq.empty
open List
open Seq
printfn %"{empty}"
Proto buďte opatrní, když otevřete moduly nebo obory názvů, jako List
jsou nebo Seq
které obsahují členy, které mají identické názvy; místo toho zvažte použití kvalifikovaných názvů. Měli byste se vyhnout jakékoli situaci, kdy je kód závislý na pořadí deklarací importu.
Deklarace typu Otevření
Jazyk F# podporuje open
typ takto:
open type System.Math
PI
Tím se zpřístupní všechna přístupná statická pole a členové typu.
Můžete také open
určit typy záznamů definovaných jazykem F# a diskriminovanými typy sjednocení, aby se zpřístupnily statické členy. V případě diskriminovaných sjednocení můžete také zveřejnit případy sjednocení. To může být užitečné pro přístup ke sjednocovacím případům v typu deklarovanému uvnitř modulu, který nechcete otevřít, například takto:
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
Otevřít z kořenové cesty pouze se specifikátorem global
Vnořené moduly, jako je
module A =
module B =
...
lze otevřít prostřednictvím
open A // opens A
open B // opens A.B
Pokud chcete otevřít pouze plně kvalifikované moduly nebo obory názvů, mají předponu specifikátoru global
:
open global.A // works
open global.B // this now fails
open global.A.B // works
Obory názvů, které jsou ve výchozím nastavení otevřené
Některé obory názvů se tak často používají v kódu jazyka F#, že se otevírají implicitně bez nutnosti explicitní deklarace importu. Následující tabulka ukazuje obory názvů, které jsou ve výchozím nastavení otevřené.
Obor názvů | Popis |
---|---|
FSharp.Core |
Obsahuje základní definice typů jazyka F# pro předdefinované typy, například int a float . |
FSharp.Core.Operators |
Obsahuje základní aritmetické operace, jako + jsou a * . |
FSharp.Collections |
Obsahuje neměnné třídy kolekce, například List a Array . |
FSharp.Control |
Obsahuje typy pro konstrukty ovládacích prvků, jako je opožděné vyhodnocení a asynchronní výrazy. |
FSharp.Text |
Obsahuje funkce pro formátované vstupně-výstupní operace, jako printf je například funkce. |
Atribut AutoOpen
Atribut můžete použít AutoOpen
na sestavení, pokud chcete při odkazování na sestavení automaticky otevřít obor názvů nebo modul. Atribut můžete také použít AutoOpen
na modul, který automaticky otevře tento modul při otevření nadřazeného modulu nebo oboru názvů. Další informace naleznete v tématu AutoOpenAttribute.
Atribut RequireQualifiedAccess
Některé moduly, záznamy nebo typy sjednocení mohou určovat RequireQualifiedAccess
atribut. Pokud odkazujete na prvky těchto modulů, záznamů nebo sjednocení, musíte použít kvalifikovaný název bez ohledu na to, jestli zahrnete deklaraci importu. Pokud tento atribut použijete strategicky u typů, které definují běžně používané názvy, pomůžete zabránit kolizím názvů a tím zajistit, aby byl kód odolnější vůči změnám v knihovnách. Další informace naleznete v tématu RequireQualifiedAccessAttribute.