Słowo kluczowe global

Dziś trochę dla odmiany, nie będę pisał o wielowątkowości a o jednym z podstawowych słów kluczowych w c#, które na szczęście nie jest bardzo popularne – bazując na moim doświadczeniu z różnymi projektami, rzadko widuje je w kodzie.

Global przydaje się gdy mamy konflikty z przestrzeniami nazw. Wyobraźmy sobie, że mamy następujący kod (kod  bazuje na dokumentacji MSDN):

class Program
{
    public class System { }
    const int Console = 7;

    static void Main()
    {
    }
}

Następnie chcemy w metodzie Console wyświetlić jakąś wartość. Na początku próbujemy użyć po prostu Console.WriteLine:

class Program
{
    public class System { }
    const int Console = 7;

    static void Main()
    {
        Console.WriteLine("Hello World"); // Konflikt
    }
}

Niestety mamy konflikt ze stałą Console i kod nie skompiluje się. Próbujemy więc następnie użyć System.Console.WriteLine:

class Program
{
    public class System { }
    const int Console = 7;

    static void Main()
    {
        System.Console.WriteLine("Hello World"); //Znów konflikt
    }
}

Niestety znów mamy konflikt… Tym razem problem powoduje zagnieżdżona klasa System.  System. nie odnosi się do namespace ale właśnie do tej zagnieżdżonej klasy. Rozwiązaniem błędnego projektu przestrzeni nazw jest użycie słówka global:

class Program
{
    public class System
    {
    }
    const int Console = 7;

    static void Main()
    {
        global::System.Console.WriteLine("Hello World");
    }
}

Global nakazuje poszukiwanie typów od miejsca startowego (globalnego) a nie lokalnego, zależnego od aktualnego kontekstu. Oczywiście nie należy deklarować przestrzeni nazw, które pokrywają się z systemowymi dostarczonymi przez .NET Framework – jest to zła praktyka. Jeśli jednak nie mamy na to wpływu wtedy global  może okazać się bardzo przydatnym rozwiązaniem.

Leave a Reply

Your email address will not be published.