Bagikan melalui


Impor deklarasi: Kata open kunci

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

Sintaksis

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

Komentar

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

Modul atau namespace 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 -reference opsi baris perintah (atau singkatannya, -r). Untuk informasi selengkapnya, lihat Opsi Pengkompilasi.

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

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

Kode berikut menunjukkan penggunaan open kata kunci 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..."

Pengkompilasi F# tidak mengeluarkan kesalahan atau peringatan ketika ambiguitas terjadi ketika nama yang sama terjadi di lebih dari satu modul atau namespace terbuka. Ketika ambiguitas terjadi, F# memberikan preferensi pada modul atau namespace yang baru dibuka. Misalnya, dalam kode berikut, empty berarti , meskipun empty terletak di List modul dan SeqSeq.empty.

open List
open Seq
printfn %"{empty}"

Oleh karena itu, berhati-hatilah saat Anda membuka modul atau namespace 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 membuat rekaman yang ditentukan F#dan jenis serikat yang didiskriminasi untuk mengekspos anggota statis. Dalam kasus serikat yang didiskriminasi, Anda juga dapat mengekspos kasus serikat. Ini dapat membantu untuk mengakses kasus serikat 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 yang Terbuka secara Default

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

Namespace 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 malas dan ekspresi asinkron.
FSharp.Text Berisi fungsi untuk IO yang diformat, seperti printf fungsi .

Buka Otomatis Atribut

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

Atribut RequireQualifiedAccess

Beberapa modul, rekaman, atau jenis serikat dapat menentukan RequireQualifiedAccess atribut . Saat mereferensikan elemen modul, rekaman, atau serikat 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 tabrakan nama dan dengan demikian membuat kode lebih tahan terhadap perubahan pustaka. Untuk informasi selengkapnya, lihat RequireQualifiedAccessAttribute.

Lihat juga