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 WidgetsModulebildiren 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 recyapı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.

Ayrıca bkz.