Ad Alanları (F#)
Ad alanı, F# program öğelerinin bir grubuna ad eklemenizi sağlayarak kodu ilgili işlevsellik alanlarında düzenlemenize olanak tanır. Ad alanları genellikle F# dosyalarındaki üst düzey öğelerdir.
Sözdizimi
namespace [rec] [parent-namespaces.]identifier
Açıklamalar
Bir ad alanına kod koymak istiyorsanız, dosyadaki ilk bildirimin ad alanını bildirmesi gerekir. Dosyada daha fazla ad alanı bildirimi olmaması koşuluyla, dosyanın tamamının içeriği ad alanının bir parçası olur. Bu durumda, sonraki ad alanı bildirimine kadar olan tüm kodlar ilk ad alanı içinde olarak kabul edilir.
Ad alanları doğrudan değer ve işlev içeremez. Bunun yerine, değerler ve işlevler modüllere eklenmelidir ve modüller ad alanlarına dahil edilir. Ad alanları türleri ve modülleri içerebilir.
XML belgesi açıklamaları bir ad alanının üzerinde bildirilebilir, ancak yoksayılır. Derleyici yönergeleri bir ad alanının üzerinde de bildirilebilir.
Ad alanları, namespace anahtar sözcüğüyle açıkça veya bir modül bildirildiğinde örtük olarak bildirilebilir. Ad alanını açıkça bildirmek için ad alanı anahtar sözcüğünü ve ardından ad alanı adını kullanın. Aşağıdaki örnekte, bir türe ve bu ad alanına dahil edilen bir modüle sahip bir ad Widgets
alanını bildiren bir kod dosyası gösterilmektedir.
namespace Widgets
type MyWidget1 =
member this.WidgetName = "Widget1"
module WidgetsModule =
let widgetName = "Widget2"
Dosyanın tüm içeriği tek bir modüldeyse, anahtar sözcüğünü kullanarak module
ve tam modül adında yeni ad alanı adını sağlayarak ad alanlarını örtük olarak bildirebilirsiniz. Aşağıdaki örnekte, bir ad alanı Widgets
ve bir işlev içeren bir modül WidgetsModule
bildiren bir kod dosyası gösterilmektedir.
module Widgets.WidgetModule
let widgetFunction x y =
printfn "%A %A" x y
Aşağıdaki kod önceki kodla eşdeğerdir, ancak modül yerel bir modül bildirimidir. Bu durumda ad alanı kendi satırında görünmelidir.
namespace Widgets
module WidgetModule =
let widgetFunction x y =
printfn "%A %A" x y
Bir veya daha fazla ad alanında aynı dosyada birden fazla modül gerekiyorsa, yerel modül bildirimlerini kullanmanız gerekir. Yerel modül bildirimlerini kullandığınızda, modül bildirimlerinde nitelenmiş ad alanını kullanamazsınız. Aşağıdaki kod, ad alanı bildirimi ve iki yerel modül bildirimi olan bir dosyayı gösterir. Bu durumda modüller doğrudan ad alanında yer alır; dosyayla aynı ada sahip örtük olarak oluşturulmuş bir modül yoktur. Dosyadaki bağlama gibi do
diğer tüm kodlar ad alanındadır ancak iç modüllerde değildir, bu nedenle modül adını kullanarak modül üyesini widgetFunction
nitelemeniz gerekir.
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
Bu örneğin çıktısı aşağıdaki gibidir.
Module1 10 20
Module2 5 6
Daha fazla bilgi için bkz . Modüller.
İç İçe Ad Alanları
İç içe bir ad alanı oluşturduğunuzda, bunu tam olarak nitelemeniz gerekir. Aksi takdirde, yeni bir üst düzey ad alanı oluşturursunuz. Girinti, ad alanı bildirimlerinde yoksayılır.
Aşağıdaki örnekte iç içe bir ad alanının nasıl bildirilir gösterilmektedir.
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"
Dosya ve Derlemelerdeki Ad Alanları
Ad alanları tek bir projede veya derlemede birden çok dosyaya yayılabilir. Ad alanı parçası terimi, ad alanının bir dosyaya dahil edilen bölümünü açıklar. Ad alanları birden çok derlemeye de yayılabilir. Örneğin, System
ad alanı birçok derlemeye yayılan ve iç içe birçok ad alanı içeren .NET Framework'ün tamamını içerir.
Genel Ad Alanı
.NET üst düzey ad alanına global
ad eklemek için önceden tanımlanmış ad alanını kullanırsınız.
namespace global
type SomeType() =
member this.SomeMember = 0
Örneğin, diğer ad alanlarıyla ad çakışmalarını çözmek için en üst düzey .NET ad alanına başvurmak için genel de kullanabilirsiniz.
global.System.Console.WriteLine("Hello World!")
Özyinelemeli ad alanları
Tüm kapsanan kodun karşılıklı özyinelemeli olmasını sağlamak için ad alanları özyinelemeli olarak da bildirilebilir. Bu işlem aracılığıyla namespace rec
yapılır. kullanımı namespace rec
, türler ve modüller arasında karşılıklı bilgi kodu yazamamayla ilgili bazı sorunları hafifletebilir. Bunun bir örneği aşağıda verilmiştir:
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 (b: Banana) =
let flip (banana: Banana) =
match banana.Orientation with
| Up ->
banana.Orientation <- Down
banana
| Down -> banana
let peelSides (banana: Banana) =
banana.Sides
|> List.map (function
| Unpeeled -> Peeled
| Peeled -> Peeled)
match b.Orientation with
| Up -> b |> flip |> peelSides
| Down -> b |> peelSides
Özel durumun DontSqueezeTheBananaException
ve sınıfın Banana
her ikisinin de birbirine başvurduğunu unutmayın. Ayrıca modül BananaHelpers
ve sınıfı Banana
da birbirine başvurur. Ad alanından anahtar sözcüğünü MutualReferences
kaldırdıysanız, F# ile rec
ifade etmek mümkün olmaz.
Bu özellik üst düzey Modüller için de kullanılabilir.