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ý...
C# feature specifications