Pregunta ¿Qué es global ::?


En C # veo global:: usado con bastante frecuencia en el código autogenerado. No es algo que haya usado alguna vez, así que no sé cuál es el propósito. ¿Alguien puede explicar esto?


74
2018-02-22 10:50


origen


Respuestas:


global se refiere al espacio de nombre global, se puede usar para resolver problemas mediante los cuales se pueden redefinir los tipos. Por ejemplo:

class foo
{
    class System
    {

    }

}

Si tuviera que usar el sistema en el que tendría un alcance local en la clase foo, podría usar:

global::System.Console.WriteLine("foobar");

para acceder al espacio de nombres global.

Ejemplo

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
        }
    }
}

64
2018-02-22 10:55



Es un prefijo en algún momento necesario que indica el espacio de nombres raíz.

A menudo se agrega al código generado para evitar conflictos de nombres con el código de usuario.

Por ejemplo, imagina que tienes una clase llamada System, pero luego querías usar System.String. Podrías usar global::System.String para diferenciar.

Yo creo que :: proviene de C ++, donde se usa como un separador de espacios de nombres.

En la práctica, nunca lo he usado, excepto en la generación de código. Tenga en cuenta que también puede evitar algunos conflictos mediante el uso de alias. Por ejemplo using String = System.String;


17
2018-02-22 10:52



los global palabra clave contextual, cuando se trata antes del operador ::, hace referencia al espacio de nombres global, que es el espacio de nombres predeterminado para cualquier programa C # y no tiene nombre.

los global:: el especificador le dice al compilador que comience a buscar el espacio de nombres o la clase comenzando desde la raíz. Lo verá en un código generado por el sistema para que el código siempre funcione. De esta forma, si tiene un espacio de nombre justo debajo de su espacio de nombre actual que es el mismo que el espacio de nombre de nivel superior al que el código intenta acceder, no habrá conflicto.

Por ejemplo, supongamos que tiene el espacio de nombres A y el espacio de nombres B y el espacio de nombres B.A si escribo código en el espacio de nombres B.A que necesita hacer referencia a una clase en el espacio de nombres A, sin global :: No tengo forma de llegar a él. Si hago referencia a A.classname, el compilador buscará el nombre de clase en B.A. Con global :: Puedo decirle que busque el nombre de clase en global :: A.classname y encontrará el nombre de clase en la ubicación correcta.


12
2018-02-22 10:59