Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Namespace memungkinkan Anda mengatur kode ke dalam area fungsionalitas terkait dengan memungkinkan Anda melampirkan nama ke pengelompokan elemen program F#. Namespace biasanya merupakan elemen tingkat atas dalam file F#.
Sintaksis
namespace [rec] [parent-namespaces.]identifier
Komentar
Jika Anda ingin meletakkan kode di namespace, deklarasi pertama dalam file harus mendeklarasikan namespace. Konten seluruh file kemudian menjadi bagian dari namespace layanan, asalkan tidak ada deklarasi namespace lain yang ada lebih lanjut dalam file. Jika demikian, maka semua kode hingga deklarasi namespace berikutnya dianggap berada dalam namespace pertama.
Namespace tidak dapat secara langsung berisi nilai dan fungsi. Sebagai gantinya, nilai dan fungsi harus disertakan dalam modul, dan modul disertakan dalam namespace. Namespace dapat berisi jenis dan modul.
Komentar dokumen XML dapat dideklarasikan di atas namespace layanan, tetapi diabaikan. Arahan kompilator juga dapat dideklarasikan di atas namespace.
Namespace dapat dideklarasikan secara eksplisit dengan kata kunci namespace, atau secara implisit saat mendeklarasikan modul. Untuk mendeklarasikan namespace secara eksplisit, gunakan kata kunci namespace diikuti dengan nama namespace. Contoh berikut menunjukkan file kode yang mendeklarasikan namespace Widgets dengan jenis dan modul yang disertakan dalam namespace tersebut.
namespace Widgets
type MyWidget1 =
member this.WidgetName = "Widget1"
module WidgetsModule =
let widgetName = "Widget2"
Jika seluruh konten file berada dalam satu modul, Anda juga dapat mendeklarasikan namespace secara implisit dengan menggunakan module kata kunci dan memberikan nama namespace baru dalam nama modul yang sepenuhnya memenuhi syarat. Contoh berikut menunjukkan file kode yang mendeklarasikan namespace Widgets dan modul WidgetsModule, yang berisi fungsi.
module Widgets.WidgetModule
let widgetFunction x y =
printfn "%A %A" x y
Kode berikut setara dengan kode sebelumnya, tetapi modul adalah deklarasi modul lokal. Dalam hal ini, namespace harus muncul di barisnya sendiri.
namespace Widgets
module WidgetModule =
let widgetFunction x y =
printfn "%A %A" x y
Jika lebih dari satu modul diperlukan dalam file yang sama di satu atau beberapa namespace, Anda harus menggunakan deklarasi modul lokal. Saat Anda menggunakan deklarasi modul lokal, Anda tidak dapat menggunakan namespace yang memenuhi syarat dalam deklarasi modul. Kode berikut menunjukkan file yang memiliki deklarasi namespace dan dua deklarasi modul lokal. Dalam hal ini, modul dimuat langsung di namespace; tidak ada modul yang dibuat secara implisit yang memiliki nama yang sama dengan file. Kode lain dalam file, seperti do pengikatan, ada di namespace tetapi tidak dalam modul dalam, jadi Anda perlu memenuhi syarat anggota widgetFunction modul dengan menggunakan nama modul.
namespace Widgets
module WidgetModule1 =
let widgetFunction x y =
printfn "Module1 %A %A" x y
module WidgetModule2 =
let widgetFunction x y =
printfn "Module2 %A %A" x y
module useWidgets =
do
WidgetModule1.widgetFunction 10 20
WidgetModule2.widgetFunction 5 6
Output dari contoh ini adalah sebagai berikut.
Module1 10 20
Module2 5 6
Untuk informasi selengkapnya, lihat Modul .
Namespace Berlapis
Saat membuat namespace berlapis, Anda harus sepenuhnya memenuhi syarat. Jika tidak, Anda membuat namespace layanan tingkat atas baru. Indentasi diabaikan dalam deklarasi namespace layanan.
Contoh berikut menunjukkan cara mendeklarasikan namespace berlapis.
namespace Outer
// Full name: Outer.MyClass
type MyClass() =
member this.X(x) = x + 1
// Fully qualify any nested namespaces.
namespace Outer.Inner
// Full name: Outer.Inner.MyClass
type MyClass() =
member this.Prop1 = "X"
Namespace dalam File dan Rakitan
Namespace dapat mencakup beberapa file dalam satu proyek atau kompilasi.
Fragmen namespace layanan istilah menjelaskan bagian namespace layanan yang disertakan dalam satu file. Namespace juga dapat mencakup beberapa rakitan. Misalnya, System namespace mencakup seluruh .NET Framework, yang mencakup banyak rakitan dan berisi banyak namespace berlapis.
Global Namespace
Anda menggunakan namespace global layanan yang telah ditentukan sebelumnya untuk menempatkan nama di namespace tingkat atas .NET.
namespace global
type SomeType() =
member this.SomeMember = 0
Anda juga dapat menggunakan global untuk mereferensikan namespace .NET tingkat atas, misalnya, untuk mengatasi konflik nama dengan namespace lainnya.
global.System.Console.WriteLine("Hello World!")
Namespace rekursif
Namespace juga dapat dinyatakan sebagai rekursif untuk memungkinkan semua kode yang terkandung saling rekursif. Ini dilakukan melalui namespace rec. Penggunaan dapat meringankan namespace rec beberapa rasa sakit karena tidak dapat menulis kode referensial bersama antara jenis dan modul. Berikut ini adalah contohnya:
namespace rec MutualReferences
type Orientation = Up | Down
type PeelState = Peeled | Unpeeled
// This exception depends on the type below.
exception DontSqueezeTheBananaException of Banana
type Banana(orientation: Orientation) =
member val IsPeeled = false with get, set
member val Orientation = orientation with get, set
member val Sides: PeelState list = [Unpeeled; Unpeeled; Unpeeled; Unpeeled] with get, set
member self.Peel() = BananaHelpers.peel self // Note the dependency on the BananaHelpers module.
member self.SqueezeJuiceOut() = raise (DontSqueezeTheBananaException self) // This member depends on the exception above.
module BananaHelpers =
let peel (banana: Banana) =
let flip (banana: Banana) =
match banana.Orientation with
| Up ->
banana.Orientation <- Down
banana
| Down -> banana
// Update the peel state for all sides of the banana.
let peelSides (banana: Banana) =
banana.Sides
|> List.map (function
| Unpeeled -> Peeled
| Peeled -> Peeled)
// Apply the flipping and peeling logic based on the orientation.
match banana.Orientation with
| Up -> banana |> flip |> peelSides
| Down -> banana |> peelSides
Perhatikan bahwa pengecualian DontSqueezeTheBananaException dan kelas Banana keduanya saling merujuk. Selain itu, modul BananaHelpers dan kelas Banana juga saling merujuk. Ini tidak akan dimungkinkan untuk diekspresikan di F# jika Anda menghapus rec kata kunci dari MutualReferences namespace.
Fitur ini juga tersedia untuk Modul tingkat atas.