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.