2010-01-06 16 views
10

L'unica differenza che vedo è il fatto che non è possibile utilizzare la dichiarazione "using staticClass". Quindi mi chiedo:Qual è la differenza tra una classe statica e uno spazio dei nomi? (in C#)

(1) C'è una vera differenza tra una classe statica e uno spazio dei nomi?

(2) Esiste la possibilità di evitare di dover riscrivere il nome classe ogni volta che viene chiamata una funzione membro? Sto pensando a qualcosa di analogo a "using staticClass".

+4

Riscrivere il nome della classe ogni volta è in realtà, a mio parere, una buona cosa. E non è necessario * digitare * il nome ogni volta - in genere in Visual Studio, si digita la prima lettera e quindi il punto e la classe è ancora selezionata. – OregonGhost

+1

@OregonGhost: O, come dicono i Python: "I Namespace sono una delle grandi idee - facciamolo di più!" – balpha

risposta

30

Sì, una classe static è tecnicamente un tipo. Può avere membri (campi, metodi, eventi). Uno spazio dei nomi può contenere solo tipi (e non è considerato un "tipo" da solo; typeof(System) è un errore in fase di compilazione).

Non esiste un equivalente diretto all'aggiunta di una direttiva using per uno spazio dei nomi per una classe statica. È possibile, tuttavia, dichiarano gli alias:

using ShortName = ReallyReallyLongStaticClassName; 

e utilizzare

ShortName.Member 

quando ci si riferisce ai suoi membri.

Inoltre, è possibile utilizzare le classi statiche per dichiarare metodi di estensione su altri tipi e utilizzarli direttamente senza far riferimento al nome della classe in modo esplicito:

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

e usarlo come:

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

Di Naturalmente, dovrai aggiungere una direttiva using per lo spazio dei nomi contenente la classe per utilizzare il metodo di estensione se la classe non è dichiarata nello spazio dei nomi root o corrente.

+0

Btw, le classi possono anche contenere tipi. E penso che dovresti menzionare nel tuo ultimo esempio che devi usare 'using NamespaceContainingTheStaticClass'. –

+0

Martinho: Sì, una classe può avere tipi nidificati ma anche spazi dei nomi. Non è una caratteristica contrastante. La classe non è dichiarata in un namespace, quindi non è necessario "utilizzarla". Se dichiari una classe statica nello spazio dei nomi radice, i suoi metodi di estensione vengono raccolti automaticamente (il che lo rende uno dei motivi per cui non è una buona idea dichiarare le classi nello spazio dei nomi di root). –

+0

Oh, ho dimenticato di usare lo spazio dei nomi di root. Questo è ** così ** ** male ** Non l'ho nemmeno preso in considerazione. –

5

La classe statica è ancora una classe. Può contenere metodi, proprietà, ecc. Namespace è solo uno spazio dei nomi. È solo un aiuto per distinguere tra dichiarazioni di classe con lo stesso nome.

La funzione non può vivere solo in un dominio, appartiene a una classe.

Le estensioni sono probabilmente ciò che state cercando, se avete bisogno di una funzione statica senza menzionare il nome della classe.

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

Un'altra differenza è che gli spazi dei nomi possono estendersi su più assiemi, mentre le classi non possono.

3

Per quanto ho capito, gli spazi dei nomi sono solo una funzione del linguaggio; vengono rimossi dalla compilation. In altre parole, il runtime .NET non "vede" gli spazi dei nomi, solo i nomi delle classi che contengono punti. Ad esempio, la classe String nello spazio dei nomi System viene vista dal runtime .NET come una classe denominata System.String, ma non esiste alcun concetto di spazio dei nomi.

Le classi statiche, tuttavia, sono completamente comprese e gestite dal runtime .NET. Sono tipi a tutti gli effetti e puoi usare la riflessione su di essi.

Problemi correlati