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


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.