Przestrzenie nazw z zakresem plików
Notatka
Ten artykuł jest specyfikacją funkcji. Specyfikacja służy jako dokument projektowy dla funkcji. Zawiera proponowane zmiany specyfikacji wraz z informacjami wymaganymi podczas projektowania i opracowywania funkcji. Te artykuły są publikowane do momentu sfinalizowania proponowanych zmian specyfikacji i włączenia ich do obecnej specyfikacji ECMA.
Mogą wystąpić pewne rozbieżności między specyfikacją funkcji a ukończoną implementacją. Te różnice są przechwytywane w odpowiednich spotkania projektowego języka (LDM).
Więcej informacji na temat procesu wdrażania specyfikacji funkcji można znaleźć w standardzie języka C# w artykule dotyczącym specyfikacji .
Streszczenie
Przestrzenie nazw w zakresie plików używają mniej rozwlekłego formatu w przypadku typowych plików zawierających tylko jedną przestrzeń nazw. Format przestrzeni nazw ograniczonej do pliku jest namespace X.Y.Z;
(zwróć uwagę na średnik i brak nawiasów klamrowych). Umożliwia to używanie plików takich jak następujące:
namespace X.Y.Z;
using System;
class X
{
}
Semantyka polega na tym, że użycie formularza namespace X.Y.Z;
jest równoważne zapisowi namespace X.Y.Z { ... }
, w którym pozostała część pliku po przestrzeni nazw o zakresie plików znajduje się w sekcji ...
standardowej deklaracji przestrzeni nazw.
Motywacja
Analiza ekosystemu języka C# pokazuje, że około 99,7% plików% jest w jednej z następujących form:
namespace X.Y.Z
{
// usings
// types
}
lub
// usings
namespace X.Y.Z
{
// types
}
Jednak obie te metody zmuszają użytkownika do wcinania większości jego kodu i dodają sporo formalności dla tego, co jest praktycznie bardzo prostą koncepcją. Ma to wpływ na przejrzystość, wykorzystuje przestrzeń poziomą i pionową, i jest często niezadowalający dla użytkowników zarówno przyzwyczajonych do języka C#, jak i tych, którzy pochodzą z innych języków (które często mają tutaj mniej ceremonii).
Głównym celem funkcjonalności jest zatem spełnienie potrzeb większości ekosystemu przy ograniczeniu zbędnej biurokracji.
Szczegółowy projekt
Wniosek ten ma formę różnicy w istniejących jednostkach kompilacji (§14.2) sekcji specyfikacji.
Różnica
compilation_unit definiuje ogólną strukturę pliku źródłowego. Jednostka kompilacji składa się z zera lub większej liczby using_directive, po których następuje zero lub więcej global_attributes oraz zero lub więcej namespace_member_declaration.
compilation_unit definiuje ogólną strukturę pliku źródłowego. Jednostka kompilacji składa się z zera lub większej liczby using_directive, po których następuje zero lub więcej global_attributes a następnie compilation_unit_body. compilation_unit_body może być file_scoped_namespace_declaration lub zero lub więcej instrukcji s i 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
;
... Niezmienione...
file_scoped_namespace_declaration będzie współtworzyć członków odpowiadających namespace_declaration jest ona semantycznie równoważna. Zobacz (deklaracje przestrzeni nazw), aby uzyskać więcej informacji.
Deklaracje przestrzeni nazw
namespace_declaration składa się ze słowa kluczowego namespace
, nazwy przestrzeni nazw oraz jej treści, opcjonalnie zakończonej średnikiem.
file_scoped_namespace_declaration składa się ze słowa kluczowego namespace
, po którym następuje nazwa przestrzeni nazw, średnik, oraz opcjonalna lista extern_alias_directive, using_directiveoraz type_declaration.
namespace_declaration
: 'namespace' qualified_identifier namespace_body ';'?
;
file_scoped_namespace_declaration
: 'namespace' qualified_identifier ';' extern_alias_directive* using_directive* type_declaration*
;
... unchanged ...
... Niezmienione...
Dwie powyższe deklaracje przestrzeni nazw przyczyniają się do tej samej przestrzeni deklaracji, deklarując w tym przypadku dwie klasy o w pełni kwalifikowanych nazwach N1.N2.A
i N1.N2.B
. Ponieważ dwie deklaracje przyczyniają się do tej samej przestrzeni deklaracyjnej, byłby to błąd, gdyby każda zawierała deklarację elementu o tej samej nazwie.
file_scoped_namespace_declaration zezwala na zapisanie deklaracji przestrzeni nazw bez bloku { ... }
. Na przykład:
extern alias A;
namespace Name;
using B;
class C
{
}
jest semantycznie równoważne
extern alias A;
namespace Name
{
using B;
class C
{
}
}
W szczególności, file_scoped_namespace_declaration jest traktowane tak samo jak namespace_declaration w tej samej lokalizacji w compilation_unit z tym samym qualified_identifier. extern_alias_directives, using_directives i type_declarations z tego file_scoped_namespace_declaration działają tak, jakby zostały zadeklarowane w tej samej kolejności wewnątrz namespace_body tego namespace_declaration.
Plik źródłowy nie może zawierać zarówno file_scoped_namespace_declaration, jak i namespace_declaration. Plik źródłowy nie może zawierać wielu file_scoped_namespace_declarations.
Zewnętrzne aliasy
... Niezmienione...
C# feature specifications