共用方式為


檔案範圍命名空間

注意

本文是功能規格。 規格可作為功能的設計檔。 其中包含建議的規格變更,以及功能設計和開發期間所需的資訊。 這些文章會發佈,直到提議的規格變更完成並併併入目前的ECMA規格為止。

功能規格與已完成實作之間可能有一些差異。 這些差異是在相關的 語言設計會議(LDM)紀要中擷取的。

您可以在 規格的文章中了解如何將特色規範納入 C# 語言標準的過程

總結

檔案範圍命名空間在僅包含一個命名空間的檔案這種典型情況下,使用較簡潔的格式。 文件範疇命名空間格式是 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_bodycompilation_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_directiveusing_directivetype_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.AN1.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_declarationqualified_identifier相同的 namespace_declaration 在同一個 compilation_unit 中的相同位置被視為相同。 extern_alias_directiveusing_directivetype_declarationfile_scoped_namespace_declaration 會以該 namespace_declarationnamespace_body 內的相同順序宣告它們。

原始程式檔不能同時包含 file_scoped_namespace_declarationnamespace_declaration。 原始程式檔不能包含多個 file_scoped_namespace_declarationcompilation_unit 不能同時包含 file_scoped_namespace_declaration 和任何最上層 語句type_declaration不能在 一個 file_scoped_namespace_declaration之前出現。

Extern 別名

...不變...