2010-01-06 18 views
10

Gördüğüm tek fark, "staticClass kullanarak" bildirimini kullanamayacağınız gerçeğidir. Bu nedenle merak ediyorum:Statik sınıf ve ad alanı arasındaki fark nedir? (C#)

(1) statik sınıf ve bir ad arasında gerçek bir fark var mı?

(2) sınıf Adını üye işlev denir her zaman yeniden yazmak zorunda kalmamak için bir olasılık var mı? "StaticClass kullanarak" benzer bir şey düşünüyorum.

+4

Her seferinde sınıf ismini yeniden yazmak bence iyi bir şey. Ve her seferinde isim yazmak zorunda değilsiniz — tipik olarak Visual Studio'da, ilk harfi ve sonra noktayı yazacaksınız ve sınıf hala seçilecektir. – OregonGhost

+1

@OregonGhost: Ya da, Python'un dediği gibi: "İsim alanları harika bir fikirdir - daha fazlasını yapalım!" – balpha

cevap

30

Evet, bir static sınıf teknik olarak bir türüdür. Üyeleri olabilir (alanlar, yöntemler, olaylar). Bir ad alanı yalnızca türleri tutabilir (ve kendisi tarafından "tip" olarak kabul edilmez; typeof(System) bir derleme zamanı hatasıdır).

statik sınıf için bir ad alanı için bir using direktifi eklemek için doğrudan bir karşılığı yoktur.

using ShortName = ReallyReallyLongStaticClassName; 

ve üyelerini bahsederken

ShortName.Member 

kullanın: Ancak, takma adları bildirebilirsiniz. gibi

public static class IntExtensions { 
    public static int Square(this int i) { return i * i; } 
} 

ve kullanmak: Of

int i = 2; 
int iSquared = i.Square(); // note that the class name is not mentioned here. 

Ayrıca, doğrudan açıkça sınıf adını ifade etmeden diğer türleri üzerinde uzatma yöntemleri bildirmek ve bunları kullanmak için statik sınıfları kullanabilirsiniz Kurs, sınıf kök veya geçerli ad alanında bildirilmemişse, uzantı yöntemini kullanmak için sınıfı içeren ad alanı için using yönergesini eklemeniz gerekir.

+0

Btw, sınıfları da türleri tutabilir. Ve son örneğinizde 'NamespaceContainingTheStaticClass' öğesini kullanarak ihtiyacınız olduğunu belirtmelisiniz. –

+0

Martinho: Evet, bir sınıfın yuvalanmış türleri olabilir, ancak ad alanları da olabilir. Bu zıtlık özelliği değil. Sınıf, bir ad alanında bildirilmez, dolayısıyla 'kullanması' gerekmez. Kök ad alanında durağan bir sınıf bildirirseniz, uzantı yöntemleri otomatik olarak alınır (bu, onu kök ad alanında sınıfları bildirmenin iyi bir fikir olmadığı nedenlerden biri yapar). –

+0

Oh, kök ad alanını kullanmayı unuttum. Bu ** yani ** ** kötü ** Ben bile düşünmedim. –

5

Statik sınıf hala bir sınıftır. Yöntemler, özellikler vb. Içerebilir. Ad alanı yalnızca bir ad alanıdır. Aynı adla sınıf beyanları arasında ayrım yapmak sadece bir yardımcıdır. Tek başına bir ad alanında yaşayamaz

Fonksiyon, bir sınıfa aittir.

Uzantıları sınıfın adını anmadan statik işlev gerekirse, aradığınızı olasılıkla gerçek değildir.

public static class MathExtensions 
{ 
public static int Square(this int x) 
{ 
    return x * x; 
} 
} 
//... 
// var hundredSquare = 100.Square(); 
3

bir diğer fark sınıfları olmayan varken ad alanları, birkaç kez toplanır yayılabilir olmasıdır.

3

Anladığım kadarıyla, ad alanları yalnızca bir dil özelliğidir; derleme ile çıkarılırlar. Başka bir deyişle, .NET çalışma zamanı, ad alanlarını değil, yalnızca nokta içerdiği sınıf adlarını "görmez". Örneğin, System ad alanındaki String sınıfı, .NET çalışma zamanı tarafından System.String adlı bir sınıf olarak görülür, ancak hiç ad alanı kavramı yoktur.

Ancak, statik sınıflar, .NET çalışma zamanı tarafından tam olarak anlaşılmış ve yönetilmiştir. Onlar tam teşekküllü türler ve onlar üzerinde yansıma kullanabilirsiniz.

İlgili konular