Megosztás a következőn keresztül:


Fájlhatókörű névterek

Jegyzet

Ez a cikk egy funkcióspecifikáció. A specifikáció a funkció tervezési dokumentumaként szolgál. Tartalmazza a specifikáció javasolt módosításait, valamint a funkció tervezése és fejlesztése során szükséges információkat. Ezeket a cikkeket mindaddig közzéteszik, amíg a javasolt specifikációmódosításokat nem véglegesítik, és be nem építik a jelenlegi ECMA-specifikációba.

A szolgáltatás specifikációja és a befejezett implementáció között eltérések lehetnek. Ezeket a különbségeket a vonatkozó nyelvi tervezési értekezlet (LDM) megjegyzései rögzítik.

A funkcióspektusok C# nyelvi szabványba való bevezetésének folyamatáról a specifikációkcímű cikkben olvashat bővebben.

Bajnoki probléma: https://github.com/dotnet/csharplang/issues/137

Összefoglalás

A fájlhatókörrel rendelkező névterek kevésbé részletes formátumot használnak a csak egy névteret tartalmazó fájlok tipikus esetéhez. A fájl hatókörébe tartozó névtér formátuma namespace X.Y.Z; (vegye figyelembe a pontosvesszőt és a zárójelek hiányát). Ez az alábbihoz hasonló fájlokat tesz lehetővé:

namespace X.Y.Z;

using System;

class X
{
}

A szemantika az, hogy a namespace X.Y.Z; alak használata egyenértékű a namespace X.Y.Z { ... } írásával, ahol a fájl névtérrel határolt részét követő fennmaradó rész a ... szakaszában található egy szabványos névtérdeklarációnak.

Motiváció

A C#-ökoszisztéma elemzése azt mutatja, hogy körülbelül 99,7% fájl az alábbi űrlapok egyike:

namespace X.Y.Z
{
    // usings

    // types
}

vagy

// usings

namespace X.Y.Z
{
    // types
}

Azonban mindkét űrlap arra kényszeríti a felhasználót, hogy behúzhassa a kód nagy részét, és tisztességes mennyiségű ceremóniát adjon hozzá ahhoz, ami valójában egy nagyon alapvető fogalom. Ez befolyásolja a tisztaságot, vízszintes és függőleges területet használ, és gyakran nem kielégítő a C# és más nyelvekről érkező felhasználók számára is (amelyek általában kevesebb ceremóniát használnak itt).

A funkció elsődleges célja tehát az, hogy az ökoszisztéma nagy része igényeinek kielégítése kevesebb felesleges sablonszöveggel valósuljon meg.

Részletes kialakítás

Ez a javaslat a specifikáció meglévő összeállítási egységeinek (14.2. §) szakaszának diff formájában jelenik meg.

Különbség

A compilation_unit egy forrásfájl általános szerkezetét határozza meg. A fordítási egység nullából vagy több using_directive, majd nulla vagy több global_attributes, majd nulla vagy több namespace_member_declarations-ből áll.

A compilation_unit egy forrásfájl általános szerkezetét határozza meg. A fordítási egység nulla vagy több using_directive-ból, ezt követően nulla vagy több global_attributes-ból, majd egy compilation_unit_body-ből áll. Egy compilation_unit_body vagy egy file_scoped_namespace_declaration, vagy nulla vagy több utasításés namespace_member_declarationlehet.

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
    ;

... változatlan...

A file_scoped_namespace_declaration tagjai megegyeznek azzal a namespace_declaration, amellyel szemantikailag egyenértékű. További részletekért lásd: (Névtér-deklarációk).

Névtér-deklarációk

A namespace_declaration a namespacekulcsszóból, majd egy névtérnévből és törzsből áll, amelyet igény szerint pontosvessző követ. A file_scoped_namespace_declaration a namespacekulcsszóból áll, amelyet névtérnév, pontosvessző és egy választható lista követ: extern_alias_directive, using_directiveés type_declaration.

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

... unchanged ...

... változatlan...

a fenti két névtér-deklaráció ugyanahhoz a deklarációs térhez járul hozzá, ebben az esetben két osztályt deklarál a teljes névvel N1.N2.A és N1.N2.B. Mivel a két deklaráció ugyanahhoz a deklarációs térhez járul hozzá, hiba lett volna, ha mindegyik egy azonos nevű tag deklarációját tartalmazza.

A file_scoped_namespace_declaration lehetővé teszi a névtér deklarációjának írását a { ... } blokk nélkül. Például:

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

szemantikailag egyenértékű a

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

Pontosabban, egy file_scoped_namespace_declaration-t ugyanúgy tekintik, mint egy namespace_declaration-t ugyanazon a helyen egy compilation_unit-ben, ugyanolyan qualified_identifieresetén. A extern_alias_directive-k, a using_directive-k és a type_declaration-k az adott file_scoped_namespace_declaration esetén úgy működnek, mintha ugyanolyan sorrendben lettek volna deklarálva az adott namespace_declarationnamespace_body belsejében.

A forrásfájlok nem tartalmazhatnak file_scoped_namespace_declaration és namespace_declaration. A forrásfájlok nem tartalmazhatnak több file_scoped_namespace_declaration. A compilation_unit nem tartalmazhat mind file_scoped_namespace_declaration, mind bármilyen legfelső szintű utasításokat. type_declarationsose előzheti meg a file_scoped_namespace_declaration-t.

Extern aliasok

... változatlan...