Filenomfångsnamnutrymmen
Not
Den här artikeln är en funktionsspecifikation. Specifikationen fungerar som designdokument för funktionen. Den innehåller föreslagna specifikationsändringar, tillsammans med information som behövs under utformningen och utvecklingen av funktionen. Dessa artiklar publiceras tills de föreslagna specifikationsändringarna har slutförts och införlivats i den aktuella ECMA-specifikationen.
Det kan finnas vissa skillnader mellan funktionsspecifikationen och den slutförda implementeringen. Skillnaderna fångas upp i de relevanta LDM-anteckningarna (Language Design Meeting) .
Du kan läsa mer om processen för att införa funktionsspecifikationer i C#-språkstandarden i artikeln om specifikationerna.
Champion-problem: https://github.com/dotnet/csharplang/issues/137
Sammanfattning
Filavgränsade namnområden använder ett enklare format för filer som endast innehåller ett namnområde. Namnområdesformatet för filomfattning är namespace X.Y.Z;
(observera semikolonet och bristen på klammerparenteser). På så sätt kan du använda filer som följande:
namespace X.Y.Z;
using System;
class X
{
}
Semantiken är att använda namespace X.Y.Z;
-formen motsvarar att skriva namespace X.Y.Z { ... }
där resten av filen som följer det filomfattande namnområdet ingår i ...
-sektionen av en standardnamnområdesdeklaration.
Motivation
Analysen av C#-ekosystemet visar att cirka 99,7% filer är något av följande formulär:
namespace X.Y.Z
{
// usings
// types
}
eller
// usings
namespace X.Y.Z
{
// types
}
Båda dessa formulär tvingar dock användaren att dra in majoriteten av sin kod och lägga till en hel del ceremoni för vad som i själva verket är ett mycket grundläggande begrepp. Detta påverkar tydligheten, använder horisontellt och lodrätt utrymme och är ofta otillfredsställande för användare som både är vana vid C# och kommer från andra språk (som ofta har mindre formalitet här).
Det primära målet med funktionen är därför att tillgodose behoven hos majoriteten av ekosystemet med mindre onödigt standardinnehåll.
Detaljerad design
Detta förslag tar formen av en diff till de befintliga kompileringsenheterna (§14.2) avsnitt i specifikationen.
Diff
En compilation_unit definierar den övergripande strukturen för en källfil. En kompileringsenhet består av noll eller fler using_directiveföljt av noll eller fler global_attributes följt av noll eller fler namespace_member_declarations.
En compilation_unit definierar den övergripande strukturen för en källfil. En kompileringsenhet består av noll eller fler using_directiveföljt av noll eller fler global_attributes följt av en compilation_unit_body. En compilation_unit_body kan antingen vara en file_scoped_namespace_declaration eller noll eller mer -instruktions och 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
;
... oförändrad...
En file_scoped_namespace_declaration ger medlemmar som motsvarar den namespace_declaration som den är semantiskt likvärdig med. Mer information finns i (Namnområdesdeklarationer).
Namnområdesdeklarationer
En namespace_declaration består av nyckelordet namespace
, följt av ett namnområdesnamn och en brödtext, eventuellt följt av ett semikolon.
En file_scoped_namespace_declaration består av nyckelordet namespace
, följt av ett namnområdesnamn, ett semikolon och en valfri lista över extern_alias_directives, using_directives och type_declarations.
namespace_declaration
: 'namespace' qualified_identifier namespace_body ';'?
;
file_scoped_namespace_declaration
: 'namespace' qualified_identifier ';' extern_alias_directive* using_directive* type_declaration*
;
... unchanged ...
... oförändrad...
de två namnområdesdeklarationerna ovan bidrar till samma deklarationsutrymme, i det här fallet deklarerar två klasser med de fullständigt kvalificerade namnen N1.N2.A
och N1.N2.B
. Eftersom de två deklarationerna bidrar till samma deklarationsutrymme skulle det ha varit ett fel om var och en innehöll en deklaration av en medlem med samma namn.
En file_scoped_namespace_declaration tillåter att en namnområdesdeklaration skrivs utan { ... }
block. Till exempel:
extern alias A;
namespace Name;
using B;
class C
{
}
är semantiskt likvärdigt med
extern alias A;
namespace Name
{
using B;
class C
{
}
}
Mer specifikt behandlas en file_scoped_namespace_declaration på samma sätt som en namespace_declaration på samma plats i compilation_unit med samma qualified_identifier. extern_alias_directives, using_directives och type_declarations av den file_scoped_namespace_declaration fungera som om de deklarerades i samma ordning i namespace_body för den namespace_declaration.
En källfil får inte innehålla både en file_scoped_namespace_declaration och en namespace_declaration. En källfil får inte innehålla flera file_scoped_namespace_declarations. En compilation_unit får inte innehålla både en file_scoped_namespace_declaration- och -instruktion på toppnivås. type_declarations kan inte komma före en file_scoped_namespace_declaration.
Externa alias
... oförändrad...
C# feature specifications