Namespace は、識別子のコンテナで、他の
Namespaces やグローバル・スコープの識別子と競合しないようにします。
構文
Namespace identifier [ Alias "aliasname" ]
statements
End Namespace
パラメータ
identifier
名前空間の名前(入れ子になった名前指定子を含む)。
aliasname
名前空間の代替外部名。
説明
名前空間は、コンパイラによる、識別子の名前の検索を区切ることができる、宣言項目です。
この目的は、基本的に、識別子を論理的にグループ化して、同じプロジェクトのいくつかの部分の間で、名前の競合を避けることです。
この形態の競合は、デフォルトでは1つのグローバル・スコープだけ提供されていて、そこでは名前の競合が発生しない、という事実に起因しています。
名前空間を使うと、この種の問題をより簡単に回避できます。グローバル・スコープで、グローバル・オブジェクトを定義することを避けられるからです。
名前空間にコードを直接含めることはできません。名前空間で宣言された手続き内でのみできます。
これは、名前空間がスコープではなく、実行されるものではなく、ただ宣言を保持するために使えるものだからです。
名前空間で宣言された変数は、暗黙的に静的であり、プログラム全体で表示されます(
Static と
Shared キーワードは使えません)。
したがって、定数を持つ初期化子のみが、許可されます。
用法
Type などの別の宣言領域とは異なり、名前空間はいくつかの部分に分割できます。
最初の部分は宣言として機能し、次の部分は拡張として機能します。
名前空間拡張の構文は、宣言部分の構文と、まったく同じです。
同じ名前空間内で、宣言または定義された識別子は、競合してはなりません。
それらは同じ名前を持つ場合がありますが、多重定義の一部としてのみです。
したがって、名前空間は、Type の宣言項目、およびグローバル・スコープと、まったく同じように動作します。
名前空間識別子へのアクセスは、名前空間の名前から使う識別子の名前に接頭辞を付けるために、解決演算子 (".") を使います。
ただし、この接頭辞は、名前空間自体の内部では使えず、メンバー Type 内のメンバーと同じです。
名前空間のメンバー手続きは、この空間内で定義できます。
解決演算子(名前空間の名前の接頭辞)が使われている場合は、メンバーは、この空間の外側に設定することもできます。
このように定義された手続きは、名前空間での宣言の後に表示されなければなりません。
名前空間は、別の名前空間の中に定義することができます。
ただし、この宣言は、名前空間を含む名前空間の、最も外側の宣言レベルで発生する必要があります。
名前空間宣言は、手続き本体内や、Type ブロック内に配置できません。
名前空間に非常に複雑な名前がある場合、その名前の別名を定義すると便利な場合があります。
別名は、よりシンプルな名前になります。
名前空間の別名に与えられる名前は、これがグローバル・スコープであるかどうかにかかわらず、同じ名前空間内の他の識別子の名前と競合してはいけません。
注: パーサーは、匿名の名前空間(
identifier の用語なし)を定義できますが、これは実際の C++ 能力との唯一の類似点です:
FB コンパイラーは、このような場合に、モジュールごとに1つではなく、複数の個別の匿名名前空間を、自動的に生成します。
FB 匿名名前空間は、それを含むモジュールの本体からでも、すべての宣言にアクセスできないので、ほとんど使いものになりません。
内部に、モジュール・コンストラクター/デストラクタをカプセル化すること以外に、他に何もできません。
'Using (Namespaces)' 命令文
Using (Namespaces) により、フルネーム(つまり、名前空間名の後に "." 演算子と識別子名が続く)を指定しなくても、簡略化された方法で名前空間の識別子を使えるようになります。
各 Using コマンは、参照された名前空間のすべての識別子を、直接使えます。
- 構文:
Using identifier [, identifier [, ...] ]
- パラメータ:
identifier: The name of the Namespace to use.
- 用法:
Using コマンドの後でも、名前空間の識別子の完全な名前を使うことはできますが、これはもはや必要ありません。
Using コマンドは、現在のスコープ・ブロックの最後まで、宣言されている行から有効です。
Using 指示の後に、名前空間が拡張される場合、Namespace 拡張で定義された識別子は、using 指示の前に定義された識別子とまったく同じように使えます(つまり、名前空間名の完全な表現なしで)。
複数の名前空間名に Using コマンドを入力すると、名前の競合が発生する場合があります。
この場合、Using コマンドからエラーは報告されませんが、競合する識別子の 1つを使うとエラーが発生します(予想される識別子のフルネームを使うと競合が解決します)。
例
名前空間の拡張子:
Namespace A ' Declaration of Namespace A
Dim As Integer i
End Namespace
Namespace B ' Declaration of Namespace B
Dim As Integer i
End Namespace
Namespace A ' Extension of Namespace A
Dim As Integer j
End Namespace
名前空間メンバーへのアクセス:
Dim As Integer i ' Declare i in the global scope
Namespace A
Dim As Integer i = 2 ' Declare i in Namespace A
Dim As Integer j = 3 ' Declare j in Namespace A
End Namespace
i = 1 ' Use i from global scope (.i)
A.i = 4 ' Use i from Namespace A (A.i)
名前空間で宣言された関数の外部定義:
Namespace A
Declare Function f () As Integer ' Declaration of f() in Namespace A (A.f())
End Namespace
Function A.f () As Integer ' Definition of f() from Namespace A (A.f())
Return 0
End Function
入れ子された名前空間の定義:
Namespace A
Dim As Integer i ' (A.i)
Namespace B
Dim As Integer j ' (A.B.j)
End Namespace
End Namespace
'Using (Namespaces)' コマンドを使ったアクセス:
Namespace A
Dim As Integer i ' Declaration of A.i
Dim As Integer j ' Declaration of A.j
End Namespace
Using A ' Namespace A identifiers are also used
i = 1 ' Equivalent to A.i
j = 1 ' Equivalent to A.j
'Using (Namespace)' コマンドの後の名前空間の拡張:
Namespace A
Dim As Integer i
End Namespace
Using A
Namespace A
Dim As Integer j
End Namespace
i = 0 ' Initialize A.i
j = 0 ' Initialize A.j
'Using (Namespaces)' コマンドを使ったローカル識別子間の競合:
Namespace A
Dim As Integer i ' Declare A.i
Dim As Integer j ' Declare A.j
End Namespace
Namespace B
Dim As Integer i ' Declare B.i
Dim As Integer j ' Declare B.j
Using A ' A.i/j and B.i/j are in conflict, but no error is given
End Namespace
Dim As Integer j ' Declare also j the global scope
Using B
'i = 1 ' error: Ambiguous symbol access, explicit scope resolution required (between B.i and A.i)
B.i = 1 ' ambiguity resolution solved by using full name
j = 2 ' ambiguity (between .j, B.j, A.j) solved by compiler, by choosing override .j in the global scope
参照