В C # я вижу global:: часто используется в автоматически сгенерированном коде. Я никогда не использовал это сам, поэтому не знаю, для чего. Кто-нибудь может это объяснить?
В C # я вижу global:: часто используется в автоматически сгенерированном коде. Я никогда не использовал это сам, поэтому не знаю, для чего. Кто-нибудь может это объяснить?
Ответы:
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
}
}
}
Это когда-то необходимый префикс, указывающий на корневое пространство имен.
Его часто добавляют в сгенерированный код, чтобы избежать конфликтов имен с пользовательским кодом.
Например, представьте, что у вас есть вызванный класс System, но вы хотите его использовать System.String. Вы могли бы использоватьglobal::System.String чтобы различать.
Я верю :: происходит из C ++, где он используется в качестве разделителя пространства имен.
На практике я никогда не использовал его, кроме как для генерации кода. Обратите внимание, что вы также можете обойти некоторые конфликты, используя псевдонимы. Напримерusing String = System.String;
В globalКонтекстное ключевое слово, когда речь идет до :: оператора, относится к глобальному пространству имен, которое является пространством имен по умолчанию для любой C # программы и в противном случае неназванные.
В global:: сообщает компилятору начать поиск пространства имен или класса, начиная с корня. Вы увидите это в коде, сгенерированном системой, так что код всегда работает. Таким образом, если у вас есть пространство имен прямо под вашим текущим пространством имен, которое совпадает с пространством имен верхнего уровня, к которому код пытается получить доступ, конфликта не будет.
Например, предположим, что у вас есть пространство имен A, пространство имен B и пространство имен BA, если я напишу код в пространстве имен BA, который должен ссылаться на класс в пространстве имен A, без global :: у меня нет возможности добраться до него. Если я ссылаюсь на A.classname, компилятор будет искать имя класса в BA. С помощью global :: я могу сказать ему искать имя класса в global :: A.classname, и он найдет имя класса в нужном месте.
Пространство global::имен и его идентификатор - это не то, что думает большинство людей. Это не универсальный идентификатор всего, что создано в приложении, которое находится за пределами одного из определенных пространств имен вашего приложения и которое привязано к некоторому глобальному корню.
Если вы создаете класс или тип вне пространств имен верхнего уровня, вы автоматически предполагаете, что он является частью ГЛОБАЛЬНОГО пространства имен и доступен по global::идентификатору во всех файлах вашего приложения или сборки. Фактически, эти имена чаще всего находятся только в скомпилированной ЛОКАЛЬНОЙ области видимости этого файла, но доступны через global::идентификатор.
Если вы создаете класс верхнего уровня или пространство имен в файле aspx.cs, он доступен через global::глобальное пространство имен в этом файле. Но если вы введете global::другой файл, этот класс и пространство имен не существует в глобальном пространстве имен. Однако если вы создаете тот же класс или пространство имен в файле class.cs, эти элементы будут доступны для всех других файлов через global::глобальное пространство имен и в нем, а также в локальной области видимости файлов. Зачем?
Оказывается global:: это действительно ссылка на ЛОКАЛЬНЫЕ имена верхнего уровня в области действия файла, а также на ГЛОБАЛЬНЫЕ имена, общие для сборки (например, то, что может быть скомпилировано в ваших файлах классов App_Code в типичном проекте ASP.NET).
Я нашел это очень запутанным и непоследовательным, поскольку global::подразумевает доступ к пространствам имен и типам верхнего уровня, созданным в приложении, которые привязаны к глобальному пространству имен. Некоторые, такие как "System", по умолчанию привязаны к глобальному пространству имен во всех файлах, но пользовательские могут быть или не зависеть от объема этого файла. Вот почему глобальный идентификатор также играет второстепенную роль в разрешении ссылок на имена вашей локальной корневой области.
Вы можете проверить это, создав пространства имен и классы верхнего уровня в частях вашего приложения, а затем используя, global::чтобы увидеть, к каким из них он может получить доступ в глобальном пространстве имен из разных частей вашего приложения, а к каким - нет. Тот, к которому он не может получить доступ, явно назначен «локальной глобальной области» только в этом файле, что global::помогает вам получить доступ в конфликтах имен.