Udostępnij za pośrednictwem


Deklaracje importu: open słowo kluczowe

Deklaracja importu określa moduł lub przestrzeń nazw, do której można odwoływać się bez użycia w pełni kwalifikowanej nazwy.

Składnia

open module-or-namespace-name
open type type-name

Uwagi

Odwoływanie się do kodu przy użyciu w pełni kwalifikowanej przestrzeni nazw lub ścieżki modułu za każdym razem może tworzyć kod, który jest trudny do zapisu, odczytu i konserwacji. Zamiast tego możesz użyć open słowa kluczowego dla często używanych modułów i przestrzeni nazw, aby podczas odwołowania się do elementu członkowskiego tego modułu lub przestrzeni nazw można użyć krótkiej formy nazwy zamiast w pełni kwalifikowanej nazwy. To słowo kluczowe jest podobne do słowa kluczowego using w języku C#, using namespace w języku Visual C++i Imports w Visual Basic.

Podany moduł lub przestrzeń nazw musi znajdować się w tym samym projekcie lub w przywoływnym projekcie lub zestawie. Jeśli tak nie jest, możesz dodać odwołanie do projektu lub użyć -reference opcji wiersza polecenia (lub jej skrótu). -r Aby uzyskać więcej informacji, zobacz Opcje kompilatora.

Deklaracja importu udostępnia nazwy w kodzie, który jest zgodny z deklaracją, aż do końca otaczającej przestrzeni nazw, modułu lub pliku.

W przypadku używania wielu deklaracji importu powinny one być wyświetlane w osobnych wierszach.

Poniższy kod przedstawia użycie słowa kluczowego open w celu uproszczenia kodu.

// 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..."

Kompilator języka F# nie emituje błędu ani ostrzeżenia w przypadku wystąpienia niejednoznaczności w przypadku wystąpienia tej samej nazwy w więcej niż jednym otwartym module lub przestrzeni nazw. W przypadku wystąpienia niejednoznaczności język F# daje preferencje dla ostatnio otwartego modułu lub przestrzeni nazw. Na przykład w poniższym kodzie oznacza Seq.empty, empty mimo że empty znajduje się w modułach List i Seq .

open List
open Seq
printfn %"{empty}"

Dlatego należy zachować ostrożność podczas otwierania modułów lub przestrzeni nazw, takich jak List lub Seq zawierających elementy członkowskie o identycznych nazwach, zamiast tego należy rozważyć użycie kwalifikowanych nazw. Należy unikać sytuacji, w której kod jest zależny od kolejności deklaracji importu.

Deklaracje typu otwartego

Język F# obsługuje open typ w następujący sposób:

open type System.Math
PI

Spowoduje to uwidocznienie wszystkich dostępnych pól statycznych i elementów członkowskich dla typu.

W celu uwidocznienia statycznych elementów członkowskich można również open uwidocznić typy związkówzawodowych zdefiniowane przez język F#. W przypadku związków dyskryminowanych można również uwidocznić sprawy związkowe. Może to być przydatne w przypadku uzyskiwania dostępu do przypadków unii w typie zadeklarowanym wewnątrz modułu, który może nie być otwarty, w następujący sposó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

Otwieranie z ścieżki głównej tylko z specyfikatorem global

Zagnieżdżone moduły, takie jak

module A =
    module B =
        ...

można otworzyć za pośrednictwem

open A // opens A
open B // opens A.B

Aby otworzyć tylko w pełni kwalifikowane moduły lub prefiks przestrzeni nazw z specyfikatorem global :

open global.A   // works
open global.B   // this now fails
open global.A.B // works

Przestrzenie nazw, które są domyślnie otwarte

Niektóre przestrzenie nazw są tak często używane w kodzie języka F#, że są otwierane niejawnie bez konieczności jawnej deklaracji importu. W poniższej tabeli przedstawiono przestrzenie nazw, które są domyślnie otwarte.

Przestrzeń nazw opis
FSharp.Core Zawiera podstawowe definicje typów języka F# dla wbudowanych typów, takich jak int i float.
FSharp.Core.Operators Zawiera podstawowe operacje arytmetyczne, takie jak + i *.
FSharp.Collections Zawiera niezmienne klasy kolekcji, takie jak List i Array.
FSharp.Control Zawiera typy konstrukcji sterujących, takich jak leniwa ocena i wyrażenia asynchroniczne.
FSharp.Text Zawiera funkcje sformatowanych operacji we/wy printf , takich jak funkcja.

Atrybut Autootwórz

Atrybut można zastosować AutoOpen do zestawu, jeśli chcesz automatycznie otworzyć przestrzeń nazw lub moduł podczas odwołowania się do zestawu. Możesz również zastosować atrybut do modułu AutoOpen , aby automatycznie otworzyć ten moduł po otwarciu modułu nadrzędnego lub przestrzeni nazw. Aby uzyskać więcej informacji, zobacz AutoOpenAttribute.

RequireQualifiedAccess, atrybut

Niektóre moduły, rekordy lub typy unii mogą określać RequireQualifiedAccess atrybut. W przypadku odwołowania się do elementów tych modułów, rekordów lub związków należy użyć kwalifikowanej nazwy niezależnie od tego, czy dołączysz deklarację importu. Jeśli używasz tego atrybutu strategicznie na typach, które definiują powszechnie używane nazwy, możesz uniknąć kolizji nazw, a tym samym zwiększyć odporność kodu na zmiany w bibliotekach. Aby uzyskać więcej informacji, zobacz RequireQualifiedAccessAttribute.

Zobacz też