Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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...
C# feature specifications