В С# я вижу, что 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 и найдет имя класса в правильном месте.