C # ' global::da otomatik oluşturulan kodda oldukça sık kullanıldığını görüyorum . Kendi kendime kullandığım bir şey değil, bu yüzden amacın ne olduğunu bilmiyorum. Biri bunu açıklayabilir mi?
C # ' global::da otomatik oluşturulan kodda oldukça sık kullanıldığını görüyorum . Kendi kendime kullandığım bir şey değil, bu yüzden amacın ne olduğunu bilmiyorum. Biri bunu açıklayabilir mi?
Yanıtlar:
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
}
}
}
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;
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.
İ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.