Share via


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.emptyempty 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 ListSeq 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