檔案範圍命名空間
注意
本文是功能規格。 規格可作為功能的設計檔。 其中包含建議的規格變更,以及功能設計和開發期間所需的資訊。 這些文章會發佈,直到提議的規格變更完成並併併入目前的ECMA規格為止。
功能規格與已完成實作之間可能有一些差異。 這些差異是在相關的 語言設計會議(LDM)紀要中擷取的。
總結
檔案範圍命名空間在僅包含一個命名空間的檔案這種典型情況下,使用較簡潔的格式。 文件範疇命名空間格式是 namespace X.Y.Z;
(注意分號及沒有大括弧)。 這允許類似下列的檔案:
namespace X.Y.Z;
using System;
class X
{
}
這段話的語意是,使用 namespace X.Y.Z;
形式等同於寫成 namespace X.Y.Z { ... }
,其中檔案範圍命名空間後面的其餘部分位於標準命名空間宣告的 ...
區段中。
動機
C# 生態系統的分析顯示,大約 99.7 個% 檔案都是下列其中一種形式:
namespace X.Y.Z
{
// usings
// types
}
或
// usings
namespace X.Y.Z
{
// types
}
不過,這兩種形式都迫使使用者縮排大部分的程式碼,並為實際上非常基本的概念增添了相當多的繁瑣步驟。 這會影響清晰度、使用水準和垂直空間,而且通常對使用 C# 和來自其他語言的使用者並不滿意(這裡通常較少儀式)。
因此,功能的主要目標是滿足大部分生態系統的需求,同時減少不必要的重複範本。
詳細設計
差異
compilation_unit 會定義來源檔案的整體結構。 編譯單位包含零或多個 using_directive,後面接著零或多個 global_attributes,後面接著零或多個 namespace_member_declaration。
compilation_unit 會定義來源檔案的整體結構。 編譯單位包含零或多個 using_directive,後面接著零或多個 global_attributes,後面接著 compilation_unit_body。 compilation_unit_body 可以是 file_scoped_namespace_declaration 或零或多個 語句,s 和 namespace_member_declarations。
compilation_unit
~~ : extern_alias_directive* using_directive* global_attributes? namespace_member_declaration*~~
: extern_alias_directive* using_directive* global_attributes? compilation_unit_body
;
compilation_unit_body
: statement* namespace_member_declaration*
| file_scoped_namespace_declaration
;
不變。
file_scoped_namespace_declaration 將提供與其語意等同的 namespace_declaration 之成員。 如需詳細資訊,請參閱(命名空間宣告)。
命名空間宣告
namespace_declaration 是由 關鍵詞 namespace
所組成,後面接著命名空間名稱和主體,選擇性地後面接著分號。
file_scoped_namespace_declaration 由 關鍵詞 namespace
組成,後接命名空間名稱、分號,以及一個可選的 extern_alias_directive、using_directive和 type_declaration的清單。
namespace_declaration
: 'namespace' qualified_identifier namespace_body ';'?
;
file_scoped_namespace_declaration
: 'namespace' qualified_identifier ';' extern_alias_directive* using_directive* type_declaration*
;
... unchanged ...
...保持不變...
上述的兩個命名空間宣告會貢獻相同的宣告空間,在此案例中,宣告兩個具有完整名稱的類別,N1.N2.A
和 N1.N2.B
。 由於這兩個宣告屬於相同的宣告空間,因此,如果每個宣告都包含同名成員的宣告,就會發生錯誤。
file_scoped_namespace_declaration 允許在沒有 { ... }
區塊的情況下寫入命名空間宣告。 例如:
extern alias A;
namespace Name;
using B;
class C
{
}
在語意上相當於
extern alias A;
namespace Name
{
using B;
class C
{
}
}
具體來說,file_scoped_namespace_declaration 與 qualified_identifier相同的 namespace_declaration 在同一個 compilation_unit 中的相同位置被視為相同。 extern_alias_directive、using_directive和 type_declaration的 file_scoped_namespace_declaration 會以該 namespace_declarationnamespace_body 內的相同順序宣告它們。
原始程式檔不能同時包含 file_scoped_namespace_declaration 與 namespace_declaration。 原始程式檔不能包含多個 file_scoped_namespace_declaration。 compilation_unit 不能同時包含 file_scoped_namespace_declaration 和任何最上層 語句。 type_declaration不能在 一個 file_scoped_namespace_declaration之前出現。
Extern 別名
...不變...