Neden "var" adında bir sınıf oluşturabilirim?


103

varC # bir anahtar kelime değil mi? Ama bunu neden yapabilirim:

public class var { }

public class main
{
    public static void main(string[] args)
    {
        var testVar = new var();
    }
}

Kodda varkullanılan, varsınıftan önce bildirilen mainsınıftır. Ve derleyici şikayet bile etmez.

Bunu yaptığımda:

public class int { }

veya bu:

public class true { }

Derleyici şunu söyledi intveya truebir anahtar kelime ve bu şekilde kullanılamaz. Neden aynı değil var?


6
Neden istiyorsun Çok kafa karıştırıcı ve okuması zor.
duffymo


31
çok güzel soru!
Richard

50
var var = "var";Bir yöntemde de yapabilirsiniz . Sonuçta bugün Cuma.
Henk Holterman

11
Tahmin ediyorum ki, "var" özel bir şey ifade etmeden önce , kod oluşturma ile geriye dönük uyumlu olmayı bu şekilde yaptılar .
vidstige

Yanıtlar:


101

varbu listeye göre bir anahtar kelime değil .

bu bağlamsal bir anahtar sözcüktür, bu nedenle derleyici, hangi sınıfın sizin sınıfınız ve hangisinin bağlamsal anahtar kelime olduğuna karar verebilir ve hiçbir karışıklık ortaya çıkmaz.

bağlamsal bir anahtar kelime:

kodda belirli bir anlam sağlamak için kullanılır, ancak C # 'da ayrılmış bir kelime değildir.

rezerve edilmediği için onu kullanabilirsiniz.

Yukarıdaki yorumlarda belirtildiği gibi, Eric Lipperts blogunda her c # sürümüne eklenen çeşitli anahtar kelimelerin ve bağlamsal anahtar kelimelerin bir listesinin yanı sıra farklılıkların bir tartışması var.

C # 1.0'da anahtar kelime setine karar verildiğinden beri, geriye dönük uyumluluğu korumak için hiçbir ekleme yapılmamış olması ilginçtir.


1
Ancak, burada msdn.microsoft.com/en-us/library/bb383973.aspx "C # Anahtar Kelimeler" altında kategorize edilmiştir ... kafa karıştırıcı!
Richard

4
Ama bu bir Contextual Keyword. "Bağlamsal bir anahtar kelime kodda belirli bir anlam sağlamak için kullanılır, ancak bu C # 'da ayrılmış bir kelime değildir . Kısmi ve nerede gibi bazı bağlamsal anahtar kelimeler iki veya daha fazla bağlamda özel anlamlara sahiptir."
Tim Schmelter

5
@TimSchmelter O halde "var" bir "anahtar kelimedir". Sadece "ayrılmış bir kelime" değil, değil mi?
luiscubal

2
Sanırım eski kodla uyumluluğu sürdürmek için - eğer birinin adlandırılmış bir sınıfı varsa, varo zaman C # yükseltilirken her şey bozulmaz.
Callum Rogers

1
@CallumRogers: C # ekibi bunu tam olarak bu yüzden yaptı. Aynı, daha sonra tanıtılan, katılma vb. Gibi diğer "anahtar kelimeler" için de geçerlidir (bu arada tümü bağlamsal).
Abel

18

Derleyici, varsınıf adı olarak kullandığınız bağlamın hiçbir zaman anahtar kelime için bir bağlam olmadığını bilecek kadar akıllıdır , bu nedenle buna izin verir (bu nedenle bağlamsal bir anahtar kelime olarak tanımlanır ).


Bu cevabın en azından biraz yanıltıcı olduğunu düşünüyorum. Derleyici, varkod gibi bir anahtar kelime olarak kullanılıp kullanılmadığını belirlemek için tam olarak "yeterince akıllı" değildir var testVar = new var();. Evet, adlı özel tip olmadığı açısından bağlam, vartanımlandı, içine oynar, ama derleyici olduğu için tam da değil bilmek durumlarda akıllı yeterince olmadığını var testVarsınıfına karşılık gelir varya da anahtar kelimeye varsınıfa o varsayılan böyle bir bağlamda. Mıydı varanahtar kelime, çok aynı "bağlamında" kullanılabilecek farklı adlandırılmış.
VEYA Mapper

addBurada olduğu gibi diğer bağlamsal anahtar kelimelerle çelişki - burada, derleyici her seferinde anahtar kelimenin kastedildiğini (olay bildirimi; tanımlayıcı burada bir anlam ifade etmez) veya kodun bir tanımlayıcıya (tür veya bir bildirimde isim, tanımlayıcının bir yöntem gövdesi içinde kullanılması; anahtar kelime burada bir anlam ifade etmez).
VEYA Mapper

12

Buna bakmanın başka bir yolu: Anahtar kelime olarak "var", C # 'ın ilk sürümlerinde değildi ("int" ve "true" nun aksine), bu nedenle, o zaman "var" adlı bir sınıfa sahip olan bir kod yazmış olabilirsiniz. Bu tamamen güzel ve yasaldı. Daha sonra dile "var" eklendiğinde, tasarımcılar onu yalnızca belirli bağlamlarda bir anahtar kelime yapacak kadar nazik davrandılar, böylece mevcut var sınıfınız yine de çalışırdı.

Bu, dil tasarımının gerçek zorluklarından biridir - mevcut kodu bozmadan ve yeni özellikleri kullanmak zahmetli hale getirmeden yeni özelliklerin nasıl ekleneceği.


8

Sürüm 3'ten önceki C # sürümlerinde, örtük olarak yazılan yerel değişkenler henüz desteklenmiyordu, bu nedenle varözel bir anlamı yoktu ve adlandırılmış değişkenleri ve sınıfları tanımlamak mümkündü var. Her iki oluşumları çünkü örnek program yasal olduğu variçinde mainsınıfa sevk var.

C # 3 ve sonraki sürümler aşağı doğru uyumludur, bu nedenle sürüm 3'ten önce C # ile yazılan kod hala yeni derleyicilerle derlenir.

intve trueC # 1'den beri anahtar kelimelerdir.


3

Anahtar kelimeler bağlamsal olarak ayrılabilir. Kaynak kodu ayrıştırıldığında, bu içerik ayrıştırma ağacının bir parçası olarak oluşturulur. Anahtar kelimelerin değerlendirilmesi bu bağlamda gerçekleşir. Dolayısıyla, bu durumda, var ayrılmış bir bağlamda değildir ve onu bir atama deyiminde kullandığınız zamanki anlama gelmeyecektir. Bu esnekliğin bir nedeninin, var'ın C # 3'te tanıtılmış olması olduğuna inanıyorum, bu nedenle onu her yerde rezerve etmek bazı programlarda geriye dönük uyumluluğu bozabilirken, onu değişken tür bildirimi olarak kullanmak önceki sürümlerde derlenmezdi, bu nedenle yok kırılma.

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.