Importálási deklarációk: A open
kulcsszó
Az importálási deklaráció olyan modult vagy névteret határoz meg, amelynek elemeire teljes név használata nélkül hivatkozhat.
Syntax
open module-or-namespace-name
open type type-name
Megjegyzések
A kódra való hivatkozás a teljes névtér vagy modul elérési útja használatával minden alkalommal olyan kódot hozhat létre, amely nehezen írható, olvasható és karbantartható. Ehelyett használhatja a kulcsszót a open
gyakran használt modulokhoz és névterekhez, így amikor az adott modul vagy névtér egy tagjára hivatkozik, a teljes név helyett a név rövid formáját használhatja. Ez a kulcsszó hasonló a C#, using namespace
a using
Visual C++ és Imports
a Visual Basic kulcsszóhoz.
A megadott modulnak vagy névtérnek ugyanabban a projektben vagy hivatkozott projektben vagy szerelvényben kell lennie. Ha nem, hozzáadhat egy hivatkozást a projekthez, vagy használhatja a -reference
parancssori lehetőséget (vagy annak rövidítését). -r
További információt a Fordító beállításai című témakörben talál.
Az importálási deklaráció a deklarációt követő kódban teszi elérhetővé a neveket a belefoglalt névtér, modul vagy fájl végéig.
Ha több importálási deklarációt használ, azoknak külön sorokban kell megjelenniük.
Az alábbi kód a kulcsszó használatát mutatja be a open
kód egyszerűsítése érdekében.
// 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..."
Az F# fordító nem ad ki hibát vagy figyelmeztetést, ha kétértelműség történik, ha ugyanaz a név egynél több nyitott modulban vagy névtérben fordul elő. Kétértelműség esetén az F# a legutóbb megnyitott modult vagy névteret részesíti előnyben. Az alábbi kódban például azt jelenti, empty
hogy Seq.empty
empty
a modul és Seq
a List
modul egyaránt megtalálható.
open List
open Seq
printfn %"{empty}"
Ezért ügyeljen arra, hogy olyan modulokat vagy névtereket nyisson meg, amelyek List
Seq
azonos nevű tagokat tartalmaznak, ehelyett fontolja meg a minősített nevek használatát. Kerülje azokat a helyzeteket, amelyekben a kód az importdeklarációk sorrendjétől függ.
Típusdeklarációk megnyitása
Az F# az alábbihoz hasonló típusokat támogat open
:
open type System.Math
PI
Ez elérhetővé teszi az összes elérhető statikus mezőt és tagot a típuson.
A statikus tagok közzététele érdekében F#-ként definiált rekord- és diszkriminált egyesítési típusok is open
közzétehetők. A diszkriminált szakszervezetek esetében a szakszervezeti eseteket is közzéteheti. Ez hasznos lehet az egyesítő esetek eléréséhez egy modulon belül deklarált típusban, amelyet esetleg nem szeretne megnyitni, például:
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
Megnyitás gyökérútvonalról csak a kijelölővel global
Beágyazott modulok, például
module A =
module B =
...
nyitható meg a
open A // opens A
open B // opens A.B
Ha csak a teljes mértékben minősített modulokat vagy névtereket szeretné megnyitni a global
megadóval:
open global.A // works
open global.B // this now fails
open global.A.B // works
Alapértelmezés szerint megnyitott névterek
Egyes névterek olyan gyakran használatosak az F#-kódban, hogy implicit módon, explicit importálási deklaráció nélkül nyílnak meg. Az alábbi táblázat az alapértelmezés szerint megnyitott névtereket mutatja.
Névtér | Leírás |
---|---|
FSharp.Core |
Alapszintű F#-típusdefiníciókat tartalmaz a beépített típusokhoz, például int és float . |
FSharp.Core.Operators |
Olyan alapszintű aritmetikai műveleteket tartalmaz, mint például + a .* |
FSharp.Collections |
Nem módosítható gyűjteményosztályokat tartalmaz, például List és Array . |
FSharp.Control |
Olyan vezérlőszerkezetek típusait tartalmazza, mint a lusta kiértékelés és az aszinkron kifejezések. |
FSharp.Text |
Formázott IO-függvényeket tartalmaz, például a függvényt printf . |
AutoOpen attribútum
Az attribútumot akkor alkalmazhatja AutoOpen
egy szerelvényre, ha automatikusan meg szeretne nyitni egy névteret vagy modult, amikor a szerelvényre hivatkozik. Az attribútumot egy AutoOpen
modulra is alkalmazhatja a modul automatikus megnyitásához a szülőmodul vagy a névtér megnyitásakor. További információ: AutoOpenAttribute.
RequireQualifiedAccess attribútum
Egyes modulok, rekordok vagy egyesítő típusok megadhatják az RequireQualifiedAccess
attribútumot. Amikor ezen modulok, rekordok vagy egyesítők elemeire hivatkozik, minősített nevet kell használnia, függetlenül attól, hogy importálási deklarációt tartalmaz-e. Ha ezt az attribútumot stratégiailag használja a gyakran használt neveket definiáló típusok esetében, segít elkerülni a névütközést, és ezáltal rugalmasabbá teheti a kódokat a kódtárak változásaival szemben. További információ: RequireQualifiedAccessAttribute.
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: