Что такое глобальный ::?


116

В C # я вижу global:: часто используется в автоматически сгенерированном коде. Я никогда не использовал это сам, поэтому не знаю, для чего. Кто-нибудь может это объяснить?




Ответы:


104

global относится к глобальному пространству имен, его можно использовать для решения проблем, с помощью которых вы можете переопределять типы. Например:

class foo
{
    class System
    {

    }

}

Если бы вы использовали System там, где это было бы локально в классе foo, вы могли бы использовать:

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
        }
    }
}

Что произойдет, если у меня будет автоматически сгенерированный класс с префиксом глобального пространства имен, а класс назывался Foo. У меня был созданный мной класс, который также назывался Foo, также без пространства имен?
— Sachin Kainth

Если автоматически сгенерированный класс имел префикс глобального пространства имен и назывался Foo, global будет ссылаться на класс в глобальном пространстве имен. В любом пространстве имен может быть только одно определение с тем же именем. Если бы вам пришлось создать экземпляр класса из другого пространства имен, посредством чего вы определили другое значение для Foo, это заняло бы наиболее локальную область видимости. См.
— Правку

26

Это когда-то необходимый префикс, указывающий на корневое пространство имен.

Его часто добавляют в сгенерированный код, чтобы избежать конфликтов имен с пользовательским кодом.

Например, представьте, что у вас есть вызванный класс System, но вы хотите его использовать System.String. Вы могли бы использоватьglobal::System.String чтобы различать.

Я верю :: происходит из C ++, где он используется в качестве разделителя пространства имен.

На практике я никогда не использовал его, кроме как для генерации кода. Обратите внимание, что вы также можете обойти некоторые конфликты, используя псевдонимы. Напримерusing String = System.String;


14

В globalКонтекстное ключевое слово, когда речь идет до :: оператора, относится к глобальному пространству имен, которое является пространством имен по умолчанию для любой C # программы и в противном случае неназванные.

В global:: сообщает компилятору начать поиск пространства имен или класса, начиная с корня. Вы увидите это в коде, сгенерированном системой, так что код всегда работает. Таким образом, если у вас есть пространство имен прямо под вашим текущим пространством имен, которое совпадает с пространством имен верхнего уровня, к которому код пытается получить доступ, конфликта не будет.

Например, предположим, что у вас есть пространство имен A, пространство имен B и пространство имен BA, если я напишу код в пространстве имен BA, который должен ссылаться на класс в пространстве имен A, без global :: у меня нет возможности добраться до него. Если я ссылаюсь на A.classname, компилятор будет искать имя класса в BA. С помощью global :: я могу сказать ему искать имя класса в global :: A.classname, и он найдет имя класса в нужном месте.


15
Если вы берете контент с онлайн-ресурсов, пожалуйста, укажите правильную атрибуцию: MSDN и какое глобальное ключевое слово в C #
— Барт,

3
k .. @ Барт, спасибо за ваш комментарий, я запомню, когда отвечу в следующий раз .. Но почему это отрицательный голос?
— кодер

3

Пространство global::имен и его идентификатор - это не то, что думает большинство людей. Это не универсальный идентификатор всего, что создано в приложении, которое находится за пределами одного из определенных пространств имен вашего приложения и которое привязано к некоторому глобальному корню.

Если вы создаете класс или тип вне пространств имен верхнего уровня, вы автоматически предполагаете, что он является частью ГЛОБАЛЬНОГО пространства имен и доступен по global::идентификатору во всех файлах вашего приложения или сборки. Фактически, эти имена чаще всего находятся только в скомпилированной ЛОКАЛЬНОЙ области видимости этого файла, но доступны через global::идентификатор.

Если вы создаете класс верхнего уровня или пространство имен в файле aspx.cs, он доступен через global::глобальное пространство имен в этом файле. Но если вы введете global::другой файл, этот класс и пространство имен не существует в глобальном пространстве имен. Однако если вы создаете тот же класс или пространство имен в файле class.cs, эти элементы будут доступны для всех других файлов через global::глобальное пространство имен и в нем, а также в локальной области видимости файлов. Зачем?

Оказывается global:: это действительно ссылка на ЛОКАЛЬНЫЕ имена верхнего уровня в области действия файла, а также на ГЛОБАЛЬНЫЕ имена, общие для сборки (например, то, что может быть скомпилировано в ваших файлах классов App_Code в типичном проекте ASP.NET).

Я нашел это очень запутанным и непоследовательным, поскольку global::подразумевает доступ к пространствам имен и типам верхнего уровня, созданным в приложении, которые привязаны к глобальному пространству имен. Некоторые, такие как "System", по умолчанию привязаны к глобальному пространству имен во всех файлах, но пользовательские могут быть или не зависеть от объема этого файла. Вот почему глобальный идентификатор также играет второстепенную роль в разрешении ссылок на имена вашей локальной корневой области.

Вы можете проверить это, создав пространства имен и классы верхнего уровня в частях вашего приложения, а затем используя, global::чтобы увидеть, к каким из них он может получить доступ в глобальном пространстве имен из разных частей вашего приложения, а к каким - нет. Тот, к которому он не может получить доступ, явно назначен «локальной глобальной области» только в этом файле, что global::помогает вам получить доступ в конфликтах имен.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.