Sdílet prostřednictvím


Obory názvů s vymezeným oborem souborů

Poznámka

Tento článek je specifikace funkce. Specifikace slouží jako návrhový dokument pro funkci. Zahrnuje navrhované změny specifikace spolu s informacemi potřebnými při návrhu a vývoji funkce. Tyto články se publikují, dokud nebudou navrhované změny specifikace finalizovány a začleněny do aktuální specifikace ECMA.

Mezi specifikací funkce a dokončenou implementací může docházet k nějakým nesrovnalostem. Tyto rozdíly jsou zachyceny v příslušných poznámkách k setkání o návrhu jazyka (LDM) .

Další informace o procesu přijetí specifikací funkcí do jazyka C# najdete v článku o specifikacích .

Problém šampiona: https://github.com/dotnet/csharplang/issues/137

Shrnutí

Obory názvů s vymezeným oborem souborů používají méně podrobný formát pro typický případ souborů obsahujících pouze jeden obor názvů. Formát oboru názvů s vymezeným dosahem je namespace X.Y.Z; (všimněte si středníku a bez složených závorek). To umožňuje soubory, jako jsou následující:

namespace X.Y.Z;

using System;

class X
{
}

Sémantika je taková, že použití formátu namespace X.Y.Z; odpovídá zápisu namespace X.Y.Z { ... }, kde zbytek souboru následující po oboru názvů omezeném na soubor je ve zbytku standardní deklarace oboru názvů v části ....

Motivace

Analýza ekosystému C# ukazuje, že přibližně 99,7% souborů jsou všechny tyto formy:

namespace X.Y.Z
{
    // usings

    // types
}

nebo

// usings

namespace X.Y.Z
{
    // types
}

Obě tyto formy však uživatele přinutí odsadit většinu svého kódu a přidat značné množství dodatečných kroků pro to, co je skutečně velmi jednoduchý koncept. To ovlivňuje srozumitelnost, pracuje s vodorovným a vertikálním prostorem a často není uspokojující pro uživatele zvyklé na C# i pro ty přicházející z jiných jazyků (které zde obvykle vyžadují méně formálnosti).

Hlavním cílem funkce je proto splnit potřeby většiny ekosystému s méně nadbytečným kódem.

Podrobný návrh

Tento návrh má formu rozdílu od stávajících jednotek kompilace (§ 14.2) oddílu specifikace.

Rozdíl

compilation_unit definuje celkovou strukturu zdrojového souboru. Kompilační jednotka se skládá z nuly nebo více using_directive, které jsou následovány nulou nebo více global_attributes a dále nulou nebo více namespace_member_declaration.

compilation_unit definuje celkovou strukturu zdrojového souboru. Kompilační jednotka se skládá z nuly nebo více using_directivenásledovaných nulou nebo více global_attributes následovanými compilation_unit_body. compilation_unit_body může být file_scoped_namespace_declaration nebo nula nebo více příkazů s a namespace_member_declaration.

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
    ;

... nezměněný...

file_scoped_namespace_declaration bude přispívat členy, jež odpovídají namespace_declaration, kterému je sémanticky ekvivalentní. Další podrobnosti najdete v (Deklarace oboru názvů).

Deklarace jmenných prostorů

namespace_declaration se skládá z klíčového slova namespace, za kterým následuje název oboru názvů a text, volitelně následovaný středníkem. file_scoped_namespace_declaration se skládá ze slova klíčového namespace, jména oboru, středníku a volitelného seznamu extern_alias_directive, using_directivea type_declaration.

namespace_declaration
    : 'namespace' qualified_identifier namespace_body ';'?
    ;
    
file_scoped_namespace_declaration
    : 'namespace' qualified_identifier ';' extern_alias_directive* using_directive* type_declaration*
    ;

... unchanged ...

... nezměněný...

dvě výše uvedené deklarace oboru názvů přispívají ke stejnému deklarativnímu prostoru, v tomto případě deklarují dvě třídy s plně kvalifikovanými názvy N1.N2.A a N1.N2.B. Vzhledem k tomu, že dvě deklarace přispívají ke stejnému prostoru deklarace, bylo by chybou, kdyby každá obsahovala deklaraci člena se stejným názvem.

file_scoped_namespace_declaration umožňuje zápis deklarace oboru názvů bez bloku { ... }. Například:

extern alias A;
namespace Name;
using B;
class C
{
}

je sémanticky ekvivalentní

extern alias A;
namespace Name
{
    using B;
    class C
    {
    }
}

Konkrétně se na file_scoped_namespace_declaration pohlíží stejně jako na namespace_declaration ve stejné poloze v compilation_unit se stejným qualified_identifier. extern_alias_directives, using_directives a type_declarationtohoto file_scoped_namespace_declaration fungují stejně, jako by byly deklarovány ve stejném pořadí uvnitř namespace_body tohoto namespace_declaration.

Zdrojový soubor nemůže obsahovat file_scoped_namespace_declaration i namespace_declaration. Zdrojový soubor nemůže obsahovat více file_scoped_namespace_declarations. compilation_unit nemůže obsahovat současně file_scoped_namespace_declaration ani žádné příkazy nejvyšší úrovně s. type_declarationnemůže předcházet deklaraci oboru názvů s omezením souboru .

Externí aliasy

... nezměněný...