Global nedir ::?


Yanıtlar:


104

global, global ad alanını ifade eder, türleri yeniden tanımlayabileceğiniz sorunları çözmek için kullanılabilir. Örneğin:

class foo
{
    class System
    {

    }

}

Foo sınıfında yerel olarak kapsama alınacak bir Sistem kullanacak olsaydınız, şunu kullanabilirsiniz:

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

genel ad alanına erişmek için.

Misal

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

Otomatik olarak oluşturulmuş bir sınıfa küresel ad alanı ön ekli bir sınıfa sahipsem ve sınıfa Foo adı verildiyse, kendi oluşturduğum bir sınıfa sahip olsam ne olurdu?
Sachin Kainth

Otomatik olarak oluşturulan sınıfın önünde global ad alanı varsa ve Foo olarak adlandırılırsa, global, global ad alanındaki sınıfı ifade eder. Herhangi bir ad alanında aynı ada sahip yalnızca tek bir tanım olabilir. Foo için başka bir anlam tanımladığınız başka bir ad alanının içinden sınıfın bir örneğini yaratacak olsaydınız, en yerel kapsamı alacaktır. Düzenlemeye bakın
chrisw

26

Kök ad alanını belirten bazen gerekli bir önek.

Kullanıcı koduyla isim çatışmalarını önlemek için genellikle üretilen koda eklenir.

Örneğin, bir sınıfınız olduğunu ve Systemsonra kullanmak istediğinizi hayal edin System.String. global::System.StringFarklılaştırmak için kullanabilirsiniz .

::Bir ad alanı ayırıcısı olarak kullanıldığı C ++ 'dan geldiğine inanıyorum .

Pratikte, kod üretmek dışında hiç kullanmadım. Takma adlar kullanarak da bazı anlaşmazlıkları aşabileceğinizi unutmayın. Örneğinusing String = System.String;


14

globalO :: operatörden önce geldiğinde bağlamsal anahtar kelime, herhangi bir C # programı için varsayılan ad alanı olan ve aksi takdirde isimsiz olan genel ad, ifade eder.

global::Belirteci kökünden ad veya sınıf başlangıç arayan başlatmak için derleyici söyler. Kodun her zaman çalışması için onu sistem tarafından oluşturulan kodda göreceksiniz. Bu şekilde, mevcut ad alanınızın hemen altında, kodun erişmeye çalıştığı üst düzey ad alanıyla aynı olan bir ad alanınız varsa, bir çakışma olmaz.

Örneğin, ad alanı BA ad alanında A ad alanında bir sınıfa başvurması gereken bir kod yazarsam, ad alanı A ve ad alanı B ve ad alanı BA'ya sahip olduğunuzu varsayalım. A.classname'e başvurursam, derleyici BA'da sınıf adını arayacaktır. Global :: ile ona global :: A.classname içinde sınıf adını aramasını söyleyebilirim ve uygun konumda sınıf adını bulacaktır.


15
Çevrimiçi kaynaklardan içerik alırsanız, lütfen uygun atfı sağlamak için yeterince nazik olun: MSDN ve C #'daki genel anahtar kelime nedir
Bart

3
k .. @ Bart yorumunuz için teşekkürler. Ben nexttime cevap verirken aklımda tutacağım .. Ama neden bu olumsuz oy?
coder

3

İsim global::alanı ve tanımlayıcısı çoğu insanın düşündüğü şey değildir. Bu, uygulamanızın tanımlı ad alanlarından birinin dışında yer alan ve bazı genel köklere eklenen bir uygulamada oluşturulan her şeyin evrensel bir tanımlayıcısı değildir.

Üst düzey ad alanlarınızın dışında bir sınıf veya tür oluşturursanız, bunun otomatik olarak GLOBAL ad alanının bir parçası olduğunu ve global::uygulamanızdaki veya derlemenizdeki tüm dosyalarda tanımlayıcı tarafından erişilebilir olduğunu varsayarsınız . Aslında bu adlar daha çok o dosyanın yalnızca derlenmiş YEREL kapsamında bulunur, ancak global::tanımlayıcı aracılığıyla erişilebilir .

Bir aspx.cs dosyasında en üst düzey bir sınıf veya ad global::alanı oluşturursanız, buna o dosyadaki genel ad alanından erişilebilir . Ancak global::başka bir dosya yazarsanız , bu sınıf ve ad alanı genel ad alanında bulunmaz. Bununla birlikte, aynı sınıfı veya ad alanını bir class.cs dosyasında oluşturursanız, bu öğeler, global::bu dosyaların yerel kapsamının yanı sıra, genel ad alanı aracılığıyla ve içindeki diğer tüm dosyalar için kullanılabilir . Neden?

Görünüşe global::göre, dosyanın kapsamı altındaki en üst düzey YEREL adlara ve derleme tarafından paylaşılan GLOBAL adlara (tipik bir ASP.NET projesinde App_Code sınıf dosyalarınızda derlenenler gibi) gerçekten bir referanstır.

Bunu çok kafa karıştırıcı buldum ve tutarlı değil, çünkü global::uygulamada oluşturulan ve genel ad alanına bağlı üst düzey ad alanlarına ve türlere erişim anlamına geliyor. "Sistem" gibi bazıları varsayılan olarak tüm dosyalarda genel ad alanına bağlıdır, ancak özel olanlar bu dosyanın kapsamına bağlı olabilir veya olmayabilir. Bu nedenle genel tanımlayıcı, yerel kök kapsam adlarınıza yapılan başvuruları çözmede ikincil bir role sahiptir.

Bunu, uygulamanızın bölümlerinde üst düzey ad alanları ve sınıflar oluşturarak ve ardından uygulamanızın global::farklı bölümlerinden genel ad alanında hangilerine erişebileceğini ve hangilerinin erişemeyeceğini görmek için kullanarak test edebilirsiniz. Erişemeyecekleri, yalnızca o dosyada açıkça bir "yerel genel kapsam" a atanır, bu global::da adlandırma çakışmalarına erişmenize yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.