Sdílet prostřednictvím


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.SeqSeq.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.

Viz také