Що таке глобальний ::?


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, глобальний посилався б на клас у глобальному просторі імен. У будь-якому просторі імен може бути лише одне визначення з тим самим іменем. Якщо ви створили екземпляр класу з іншого простору імен, за допомогою якого ви визначили інше значення для Foo, він би взяв найбільш локальний діапазон. Дивіться правку
— chrisw

26

Це колись необхідний префікс із зазначенням кореневого простору імен.

Його часто додають до створеного коду, щоб уникнути сутичок імен з кодом користувача.

Наприклад, уявіть, що у вас був клас під назвою System, але тоді ви хотіли використовувати System.String. Ви можете використовувати global::System.Stringдля диференціації.

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

На практиці я його ніколи не використовував, крім генерування коду. Зауважте, що ви також можете обійти деякі конфлікти, використовуючи псевдоніми. Наприкладusing String = System.String;


14

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

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

Наприклад, скажіть, що у вас є простір імен A і простір імен B і простір імен BA, якщо я записую код у просторі імен BA, який потребує посилання на клас у просторі імен A, без глобального :: Я не можу потрапити до нього. Якщо я посилаюсь на A.classname, компілятор шукатиме ім'я класу в BA With global :: Я можу сказати, щоб він шукав класне ім'я у глобальному :: A.classname, і він знайде ім'я класу у потрібному місці.


15
Якщо ви берете вміст з інтернет-ресурсів, будь ласка, будьте ласкаві, щоб забезпечити належну атрибуцію: MSDN та Що таке глобальне ключове слово у C #
— Bart

3
k .. @ Барт, дякую за ваш коментар, я маю на увазі, коли я відповідаю наступного разу ... Але чому це сутичка?
— кодер

3

global::Імена та його ідентифікатор не є то , що більшість людей думають. Це не універсальний ідентифікатор всього створеного в додатку, який лежить поза одним із визначених просторів імен вашої програми і який прикріплений до якогось глобального кореня.

Якщо ви створюєте клас або тип поза межами просторів імен верхнього рівня, ви вважаєте його автоматично частиною простору імен GLOBAL і доступним global::ідентифікатором у всіх файлах вашої програми чи збірки. Насправді ці імена частіше знаходяться лише у зібраному області LOCAL цього файлу, але доступні через global::ідентифікатор.

Якщо ви створюєте клас вищого рівня або простір імен у файлі aspx.cs, він доступний через global::глобальну область імен у цьому файлі. Але якщо ви вводите global::інший файл, цього класу та простору імен не існує у глобальному просторі імен. Якщо ви створюєте той самий клас або простір імен у файлі class.cs, ці елементи доступні для всіх інших файлів через global::глобальну область імен, а також для локальних областей файлів . Чому?

Виявляється, global::це дійсно посилання на найменування місцевих імен верхнього рівня в межах файлу, а також імена GLOBAL, якими поділяється збірка (наприклад, що може бути складено у файлах класу App_Code у типовому проекті ASP.NET).

Я вважав це дуже заплутаним і не послідовним, оскільки global::передбачає доступ до просторів імен верхнього рівня та типів, створених у додатку, які прив’язані до глобального простору імен. Деякі на кшталт "Система" за замовчуванням прив’язані до глобальної простори імен, але користувацькі можуть бути, а можуть і не залежати від обсягу цього файлу. Ось чому глобальний ідентифікатор відіграє другорядну роль у вирішенні посилань на ваші локальні імена кореневих областей.

Ви можете перевірити це, створивши простори імен верхнього рівня та класи в частинах програми, а потім використати, global::щоб побачити, які з них можуть отримати доступ у глобальному просторі імен з різних частин вашої програми та які не можуть. Ті, до яких не можна отримати доступ, чітко призначаються лише "локальній глобальній області" лише у цьому файлі, що global::допомагає вам отримати доступ до конфліктів імен.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.