다음을 통해 공유


파일 범위 네임스페이스

메모

이 문서는 기능 사양입니다. 사양은 기능의 디자인 문서 역할을 합니다. 여기에는 기능 디자인 및 개발 중에 필요한 정보와 함께 제안된 사양 변경 내용이 포함됩니다. 이러한 문서는 제안된 사양 변경이 완료되고 현재 ECMA 사양에 통합될 때까지 게시됩니다.

기능 사양과 완료된 구현 간에 약간의 불일치가 있을 수 있습니다. 이러한 차이는 관련 언어 디자인 모임(LDM)노트에 기록됩니다.

문서의에서 C# 언어 표준으로 기능 사양서를 채택하는 과정에 대해 더 알아볼 수 있습니다.

챔피언 이슈: https://github.com/dotnet/csharplang/issues/137

요약

파일 범위 네임스페이스는 네임스페이스가 하나만 포함된 파일의 일반적인 경우 덜 자세한 형식을 사용합니다. 파일 범위 네임스페이스 형식은 namespace X.Y.Z;(세미콜론 및 중괄호 부족) 이렇게 하면 다음과 같은 파일이 허용됩니다.

namespace X.Y.Z;

using System;

class X
{
}

namespace X.Y.Z; 양식을 사용하는 것은 파일 범위 네임스페이스 다음 파일의 나머지 부분이 표준 네임스페이스 선언의 ... 섹션에 있는 namespace X.Y.Z { ... }을 작성하는 것과 같은 의미를 갖습니다.

동기

C# 에코시스템의 분석에 따르면 약 99.7개의% 파일이 모두 다음 형식 중 하나입니다.

namespace X.Y.Z
{
    // usings

    // types
}

또는

// usings

namespace X.Y.Z
{
    // types
}

그러나 이러한 두 양식 모두 사용자가 코드의 대부분을 들여쓰고 사실상 매우 기본적인 개념에 대한 상당한 양의 의식을 추가하도록 강요합니다. 이는 명확성에 영향을 미치고, 수평 및 수직 공간을 사용하며, C#에 익숙한 사용자와 일반적으로 이 부분에서 절차가 덜 복잡한 다른 언어에서 전환한 사용자 모두에게 만족스럽지 않을 때가 많습니다.

따라서 이 기능의 주요 목표는 덜 불필요한 상용구로 대부분의 에코시스템의 요구를 충족하는 것입니다.

상세 디자인

이 제안은 사양의 기존 컴파일 단위(섹션§14.2)의 변경 사항 형태로 제시됩니다.

차이점

compilation_unit 원본 파일의 전체 구조를 정의합니다. 컴파일 단위는 0개 이상의 using_directive, 0개 이상의 global_attributes, 그 뒤에 0개 이상의 namespace_member_declaration로 구성됩니다.

compilation_unit 원본 파일의 전체 구조를 정의합니다. 컴파일 단위는 0개 이상의 using_directive, 그 뒤에 0개 이상의 global_attributes, 그리고 뒤이어 compilation_unit_body을 포함합니다. 컴파일_유닛_몸체파일_범위_네임스페이스_선언이거나 또는 하나 이상의 네임스페이스_멤버_선언일 수 있습니다.

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
    ;

... 변경되지 않은 ...

file_scoped_namespace_declaration는 의미상 동일한 namespace_declaration에 해당하는 멤버를 포함합니다. 자세한 내용은 (네임스페이스 선언)을 참조하세요.

네임스페이스 선언

namespace_declaration은 키워드 namespace뒤에 네임스페이스 이름과 본문이 오고, 선택적으로 세미콜론이 뒤따릅니다. file_scoped_namespace_declaration은 키워드 namespace와 네임스페이스 이름, 세미콜론, 그리고 선택적으로 extern_alias_directive, using_directive, type_declaration목록으로 구성됩니다.

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

... unchanged ...

변하지 않은...

위의 두 네임스페이스 선언은 동일한 선언 공간에 기여합니다. 이 경우, 정규화된 이름이 N1.N2.AN1.N2.B인 두 클래스를 선언합니다. 두 선언이 동일한 선언 공간에 기여하기 때문에 각 선언에 동일한 이름의 멤버 선언이 포함되어 있으면 오류가 발생합니다.

file_scoped_namespace_declaration{ ... } 블록 없이 네임스페이스 선언을 가능하게 합니다. 예를 들어:

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

의미론적으로 동등하다

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

특히 file_scoped_namespace_declaration는 동일 위치의 compilation_unit에서 동일한 qualified_identifier를 가진 namespace_declaration와 동일하게 처리됩니다. 해당 file_scoped_namespace_declarationextern_alias_directive, using_directivetype_declaration는 마치 namespace_declarationnamespace_body 내에서 동일한 순서로 선언된 것처럼 작동합니다.

원본 파일에는 file_scoped_namespace_declarationnamespace_declaration모두 포함할 수 없습니다. 소스 파일에는 여러 file_scoped_namespace_declaration을 포함할 수 없습니다. compilation_unit에는 file_scoped_namespace_declaration과 최상위 을 동시에 포함할 수 없습니다. type_declarationfile_scoped_namespace_declaration앞에 올 수 없습니다.

Extern 별칭

변경되지 않음