名前空間 (F#)
名前空間を使用すると、プログラム要素のグループに名前を割り当てて、関連する機能の区分にコードを編成することができます。
namespace [parent-namespaces.]identifier
解説
コードを名前空間に追加する場合は、ファイル内の最初の宣言で名前空間を宣言する必要があります。こうすると、ファイル全体の内容が名前空間の一部になります。
名前空間に値や関数を直接含めることはできません。代わりに、値や関数をモジュール内に含める必要があります。モジュールは名前空間に含まれます。名前空間には、型およびモジュールを含めることができます。
名前空間は、namespace キーワードを使用して、明示的に宣言できます。モジュールを宣言すると、暗黙で宣言されます。名前空間を明示的に宣言するには、namespace キーワードを使用し、その後ろに名前空間名を指定します。次の例は、名前空間に型とモジュールを含む Widgets 名前空間を宣言するコード ファイルを示しています。
namespace Widgets
type MyWidget1 =
member this.WidgetName = "Widget1"
module WidgetsModule =
let widgetName = "Widget2"
ファイルの内容全体が 1 つのモジュール内にある場合は、module キーワードを使用して、モジュールの完全修飾名で新しい名前空間名を指定すると、暗黙で名前空間を宣言できます。次の例は、Widgets 名前空間と関数を含む WidgetsModule モジュールを宣言するコード ファイルを示しています。
module Widgets.WidgetModule
let widgetFunction x y =
printfn "%A %A" x y
次のコードは、モジュールがローカル モジュール宣言であることを除いて、前のコードと同じです。この場合、名前空間を個別の行に記述する必要があります。
namespace Widgets
module WidgetModule =
let widgetFunction x y =
printfn "%A %A" x y
同じファイル内の 1 つ以上の名前空間で複数のモジュールが必要な場合は、ローカル モジュール宣言を使用する必要があります。ローカル モジュール宣言を使用する場合は、モジュール宣言では修飾名前空間を使用できません。次のコードは、名前空間宣言と 2 つのローカル モジュール宣言が含まれているファイルを示しています。このコードでは、モジュールが名前空間に直接含まれています。ファイルと同じ名前のモジュールが暗黙で作成されることはありません。do 束縛など、ファイル内のその他のコードは、内部モジュールではなく、名前空間に含まれます。そのため、モジュール名を使用して、モジュールのメンバーである widgetFunction を修飾する必要があります。
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
この例の出力は次のようになります。
Module1 10 20
Module2 5 6
詳細については、「モジュール (F#)」を参照してください。
入れ子になった名前空間
入れ子の名前空間を作成する場合は、完全修飾された名前空間にする必要があります。入れ子にしない場合は、新しい最上位の名前空間を作成します。名前空間宣言では、インデントは無視されます。
入れ子の名前空間を宣言する方法を次の例に示します。
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"
ファイルおよびアセンブリ内の名前空間
名前空間は、単一のプロジェクトまたはコンパイル内の複数のファイルにわたる場合があります。名前空間フラグメントとは、1 つのファイル中にある、名前空間の一部を表します。名前空間は、複数のアセンブリにわたる場合もあります。たとえば、System 名前空間は、多数のアセンブリにわたると共に入れ子の名前空間を多数含んでいる .NET Framework 全体を含んでいます。
グローバル名前空間
名前を .NET の最上位の名前空間に置くには、定義済みの名前空間 global を使用します。
namespace global
type SomeType() =
member this.SomeMember = 0
また、たとえば他の名前空間との名前の競合を解決するために、global を使用して最上位の .NET 名前空間を参照できます。
global.System.Console.WriteLine("Hello World!")