Impor deklarasi: Kata kunci open

Deklarasi impor menentukan modul atau namespace layanan yang elemennya dapat Anda referensikan tanpa menggunakan nama yang memenuhi syarat sepenuhnya.

Sintaks

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

Keterangan

Mereferensikan kode dengan menggunakan namespace layanan atau jalur modul yang sepenuhnya memenuhi syarat setiap kali dapat membuat kode yang sulit untuk ditulis, dibaca, dan dipertahankan. Sebagai gantinya, Anda dapat menggunakan kata kunci open untuk modul dan namespace layanan yang sering digunakan sehingga ketika Anda mereferensikan anggota modul atau namespace layanan tersebut, Anda dapat menggunakan bentuk singkat dari nama tersebut alih-alih nama yang sepenuhnya memenuhi syarat. Kata kunci ini mirip dengan kata kunci using di C#, using namespace di Visual C++, dan Imports di Visual Basic.

Modul atau namespace layanan yang disediakan harus berada dalam proyek yang sama atau dalam proyek atau perakitan yang dirujuk. Jika tidak, Anda dapat menambahkan referensi ke proyek, atau menggunakan opsi baris perintah -reference (atau disingkat -r). Untuk informasi selengkapnya, lihat Opsi Kompilator.

Deklarasi impor membuat nama tersedia dalam kode yang mengikuti deklarasi, hingga akhir namespace, modul, atau file terlampir.

Saat Anda menggunakan beberapa deklarasi impor, deklarasi tersebut akan muncul di baris terpisah.

Kode berikut menunjukkan penggunaan kata kunci open untuk menyederhanakan kode.

// 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 F# tidak menghasilkan kesalahan atau peringatan ketika terjadi ambiguitas ketika nama yang sama muncul di lebih dari satu modul atau namespace layanan yang terbuka. Ketika ada ambigui, F# memberikan preferensi ke modul atau namespace layana yang baru dibuka. Misalnya, dalam kode berikut, empty berarti Seq.empty, meskipun empty terletak di modul List dan Seq.

open List
open Seq
printfn %"{empty}"

Oleh karena itu, berhati-hatilah saat Anda membuka modul atau namespace layanan seperti List atau Seq yang berisi anggota yang memiliki nama yang identik; sebagai gantinya, pertimbangkan untuk menggunakan nama yang memenuhi syarat. Anda harus menghindari situasi di mana kode bergantung pada urutan deklarasi impor.

Deklarasi jenis terbuka

F# mendukung open pada jenis seperti:

open type System.Math
PI

Ini akan mengekspos semua bidang statis dan anggota yang dapat diakses pada jenis.

Anda juga open dapat mencatat F#-didefinisikan dan gabungan yang dibedakan untuk mengekspos anggota statis. Dalam kasus gabungan yang dibedakan, Anda juga dapat mengekspos kasus gabungan. Ini dapat membantu untuk mengakses kasus gabungan dalam jenis yang dideklarasikan di dalam modul yang mungkin tidak ingin Anda buka, seperti:

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

Buka dari jalur akar hanya dengan global penentu

Modul berlapis seperti

module A =
    module B =
        ...

dapat dibuka melalui

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

Untuk membuka hanya modul atau namespace yang sepenuhnya memenuhi syarat awalannya dengan penentu global :

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

Namespace Layanan yang Terbuka Secara Default

Beberapa namespace layanan sangat sering digunakan dalam kode F# sehingga dibuka secara implisit tanpa memerlukan deklarasi impor eksplisit. Tabel berikut ini memperlihatkan namespace layanan yang terbuka secara default.

Ruang nama Deskripsi
FSharp.Core Berisi definisi jenis F# dasar untuk jenis bawaan seperti int dan float.
FSharp.Core.Operators Berisi operasi aritmatika dasar seperti + dan *.
FSharp.Collections Berisi kelas koleksi yang tidak dapat diubah seperti List dan Array.
FSharp.Control Berisi jenis untuk konstruksi kontrol seperti evaluasi lazy dan ekspresi asinkron.
FSharp.Text Berisi fungsi untuk IO yang diformat, seperti fungsi printf.

Atribut AutoOpen

Anda dapat menerapkan atribut ke rakitan AutoOpen jika Anda ingin membuka namespace layanan atau modul secara otomatis saat rakitan dirujuk. Anda juga dapat menerapkan atribut ke modul AutoOpen untuk membuka modul tersebut secara otomatis saat modul atau namespace layanan induk dibuka. Untuk informasi selengkapnya, lihat AutoOpenAttribute.

Atribut RequireQualifiedAccess

Beberapa modul, rekaman, atau jenis serikat dapat menentukan atribut RequireQualifiedAccess. Saat Anda mereferensikan elemen modul, rekaman, atau gabungan tersebut, Anda harus menggunakan nama yang memenuhi syarat terlepas dari apakah Anda menyertakan deklarasi impor. Jika Anda menggunakan atribut ini secara strategis pada jenis yang menentukan nama yang umum digunakan, Anda membantu menghindari benturan nama dan akan membuat kode lebih tahan terhadap perubahan di pustaka. Untuk informasi selengkapnya, lihat RequireQualifiedAccessAttribute.

Lihat juga