Udostępnij za pośrednictwem


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. compilation_unit nie może zawierać zarówno file_scoped_namespace_declaration, jak i dowolnej instrukcji najwyższego poziomus. type_declarations nie może poprzedzać file_scoped_namespace_declaration.

Zewnętrzne aliasy

... Niezmienione...