[c#] 글로벌 ::?

C #에서는 global::자동 생성 코드에서 자주 사용됩니다. 내가 사용 해본 적이 없어서 목적이 뭔지 모르겠다. 누군가 이것을 설명 할 수 있습니까?



답변

global은 전역 네임 스페이스를 나타내며 유형을 재정의 할 수있는 문제를 해결하는 데 사용할 수 있습니다. 예를 들면 :

class foo
{
    class System
    {

    }

}

foo 클래스에서 로컬 범위가 지정된 System을 사용하려면 다음을 사용할 수 있습니다.

global::System.Console.WriteLine("foobar");

글로벌 네임 스페이스에 액세스합니다.

using System;

class Foo
{
    public void baz()
    {
        Console.WriteLine("Foo 1");
    }
}

namespace Demo
{
    class Foo
    {
        public void baz()
        {
            Console.WriteLine("Foo 2");
        }
    }

    class Program
    {
        protected static global::Foo bar = new global::Foo();

        static void Main(string[] args)
        {
            bar.baz(); // would write Foo 1 to console as it refers to global scope
            Foo qux = new Foo();
            qux.baz(); // would write Foo 2 to the console as it refers to the Demo namespace
        }
    }
}


답변

루트 네임 스페이스를 나타내는 언젠가 필요한 접두사입니다.

사용자 코드와 이름 충돌을 피하기 위해 생성 된 코드에 종종 추가됩니다.

예를 들어,라는 클래스를 가지고 상상 System,하지만 당신은 사용하고 싶었 System.String. global::System.String차별화 하는 데 사용할 수 있습니다 .

나는 ::그것이 네임 스페이스 구분자로 사용되는 C ++에서 온 것이라고 믿는다 .

실제로 나는 코드를 생성하는 것 외에는 그것을 사용한 적이 없습니다. 별칭을 사용하여 충돌을 피할 수도 있습니다. 예를 들면using String = System.String;


답변

global는 :: 연산자 앞에 올 때 문맥 키워드는, 모든 C # 프로그램의 기본 네임 스페이스와 달리 명명 전역 네임 스페이스를 의미한다.

global::지정은 루트에서 네임 스페이스 또는 클래스의 시작을 찾고 시작하는 컴파일러를 알려줍니다. 코드가 항상 작동하도록 시스템 생성 코드에서 볼 수 있습니다. 이렇게하면 코드가 액세스하려는 최상위 네임 스페이스와 동일한 현재 네임 스페이스 바로 아래에 네임 스페이스가있는 경우 충돌이 발생하지 않습니다.

예를 들어, global ::없이 네임 스페이스 A의 클래스를 참조해야하는 네임 스페이스 BA에 코드를 작성하는 경우 네임 스페이스 A와 네임 스페이스 B 및 네임 스페이스 BA가 있다고 가정 해 보겠습니다. A.classname을 참조하면 컴파일러는 BA에서 classname을 찾을 것입니다. global ::을 사용하면 global :: A.classname에서 classname을 찾도록 지시 할 수 있으며 적절한 위치에서 classname을 찾습니다.


답변

global::네임 스페이스와 그 식별자는 대부분의 사람들이 생각하지 것입니다. 애플리케이션의 정의 된 네임 스페이스 중 하나 외부에 있고 일부 전역 루트에 연결된 애플리케이션에서 생성 된 모든 항목의 범용 식별자가 아닙니다.

최상위 네임 스페이스 외부에서 클래스 또는 형식을 만들면 자동으로 GLOBAL 네임 스페이스의 일부로 간주하고 global::응용 프로그램 또는 어셈블리의 모든 파일에 있는 식별자로 액세스 할 수 있습니다 . 실제로 이러한 이름은 해당 파일의 컴파일 된 LOCAL 범위에만있는 경우가 더 많지만 global::식별자 를 통해 액세스 할 수 있습니다 .

aspx.cs 파일에 최상위 클래스 또는 네임 스페이스를 만드는 경우 global::해당 파일의 전역 네임 스페이스 를 통해 액세스 할 수 있습니다. 그러나 global::다른 파일 을 입력하면 해당 클래스와 네임 스페이스가 전역 네임 스페이스에 존재하지 않습니다. 그러나 class.cs 파일에서 동일한 클래스 또는 네임 스페이스를 만드는 경우 해당 항목은 global::전역 네임 스페이스 및 해당 파일 로컬 범위 를 통해 다른 모든 파일에서 사용할 수 있습니다 . 왜?

그것은 밝혀 global::정말 (일반적인 ASP.NET 프로젝트에서의 App_Code 클래스 파일로 컴파일 할 수있는 것 같은) 어셈블리에 의해 공유되는 파일의 범위에서 최고 수준의 현지 이름을 참조뿐만 아니라 세계의 이름이다.

global::전역 네임 스페이스에 연결된 애플리케이션에서 생성 된 최상위 네임 스페이스 및 유형에 대한 액세스를 의미하기 때문에 매우 혼란스럽고 일관성이 없습니다 . “시스템”과 같은 일부는 기본적으로 모든 파일에서 전역 네임 스페이스에 연결되어 있지만 사용자 지정 파일은 해당 파일의 범위에 따라 다를 수도 있고 그렇지 않을 수도 있습니다. 이것이 전역 식별자가 로컬 루트 범위 이름에 대한 참조를 확인하는 보조 역할을하는 이유입니다.

애플리케이션의 일부에서 최상위 네임 스페이스와 클래스를 만든 다음을 사용하여 애플리케이션의 global::다른 부분에서 전역 네임 스페이스에서 액세스 할 수있는 것과 불가능한 것을 확인 하여 이를 테스트 할 수 있습니다. 액세스 할 수없는 것은 해당 파일의 “로컬 전역 범위”에만 명확하게 할당 global::되므로 이름 충돌시 액세스 하는 데 도움 이 됩니다.


답변