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

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

Ответ 1

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

class foo
{
    class 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
        }
    }
}

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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