У 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, без глобального :: Я не можу потрапити до нього. Якщо я посилаюсь на A.classname, компілятор шукатиме ім'я класу в BA With global :: Я можу сказати, щоб він шукав класне ім'я у глобальному :: A.classname, і він знайде ім'я класу у потрібному місці.
global::Імена та його ідентифікатор не є то , що більшість людей думають. Це не універсальний ідентифікатор всього створеного в додатку, який лежить поза одним із визначених просторів імен вашої програми і який прикріплений до якогось глобального кореня.
Якщо ви створюєте клас або тип поза межами просторів імен верхнього рівня, ви вважаєте його автоматично частиною простору імен GLOBAL і доступним global::ідентифікатором у всіх файлах вашої програми чи збірки. Насправді ці імена частіше знаходяться лише у зібраному області LOCAL цього файлу, але доступні через global::ідентифікатор.
Якщо ви створюєте клас вищого рівня або простір імен у файлі aspx.cs, він доступний через global::глобальну область імен у цьому файлі. Але якщо ви вводите global::інший файл, цього класу та простору імен не існує у глобальному просторі імен. Якщо ви створюєте той самий клас або простір імен у файлі class.cs, ці елементи доступні для всіх інших файлів через global::глобальну область імен, а також для локальних областей файлів . Чому?
Виявляється, global::це дійсно посилання на найменування місцевих імен верхнього рівня в межах файлу, а також імена GLOBAL, якими поділяється збірка (наприклад, що може бути складено у файлах класу App_Code у типовому проекті ASP.NET).
Я вважав це дуже заплутаним і не послідовним, оскільки global::передбачає доступ до просторів імен верхнього рівня та типів, створених у додатку, які прив’язані до глобального простору імен. Деякі на кшталт "Система" за замовчуванням прив’язані до глобальної простори імен, але користувацькі можуть бути, а можуть і не залежати від обсягу цього файлу. Ось чому глобальний ідентифікатор відіграє другорядну роль у вирішенні посилань на ваші локальні імена кореневих областей.
Ви можете перевірити це, створивши простори імен верхнього рівня та класи в частинах програми, а потім використати, global::щоб побачити, які з них можуть отримати доступ у глобальному просторі імен з різних частин вашої програми та які не можуть. Ті, до яких не можна отримати доступ, чітко призначаються лише "локальній глобальній області" лише у цьому файлі, що global::допомагає вам отримати доступ до конфліктів імен.