2010-01-06 14 views
10

La única diferencia que veo es el hecho de que no puede usar la declaración "using staticClass". Por lo tanto, me pregunto:¿Cuál es la diferencia entre una clase estática y un espacio de nombres? (en C#)

(1) ¿Hay una diferencia real entre una clase estática y un espacio de nombres?

(2) ¿Existe la posibilidad de evitar tener que volver a escribir el nombre de la clase cada vez que se llame a una función miembro? Estoy pensando en algo análogo a "usar staticClass".

+4

Volver a escribir el nombre de la clase cada vez es en realidad, en mi opinión, algo bueno. Y realmente no tiene que * escribir * el nombre todas las veces, generalmente en Visual Studio, debe escribir la primera letra y luego el punto, y la clase todavía está seleccionada. – OregonGhost

+1

@OregonGhost: O, como dice la gente de Python: "Los espacios de nombres son una gran idea: ¡hagamos más de eso!" – balpha

Respuesta

30

Sí, una clase static es técnicamente un tipo. Puede tener miembros (campos, métodos, eventos). Un espacio de nombre solo puede contener tipos (y no se considera un "tipo" por sí mismo; typeof(System) es un error en tiempo de compilación).

No existe un equivalente directo a la adición de una directiva using para un espacio de nombres para una clase estática. Puede, sin embargo, declarar alias:

using ShortName = ReallyReallyLongStaticClassName; 

y utilizar

ShortName.Member 

cuando se refiere a sus miembros.

Además, puede utilizar las clases estáticas para declarar métodos de extensión en otros tipos y usarlos directamente sin hacer referencia al nombre de la clase de forma explícita:

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

y usarlo como:

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

De Por supuesto, deberá agregar una directiva using para el espacio de nombres que contiene la clase para usar el método de extensión si la clase no está declarada en el espacio de nombres raíz o actual.

+0

Por cierto, las clases también pueden contener tipos. Y creo que deberías mencionar en tu último ejemplo que necesitas 'usar NamespaceContainingTheStaticClass'. –

+0

Martinho: Sí, una clase puede tener tipos anidados pero también espacios de nombres. No es una característica de contraste. La clase no está declarada en un espacio de nombres, por lo que no es necesario 'usarla '. Si declara una clase estática en el espacio de nombres raíz, sus métodos de extensión se recogen automáticamente (lo que hace que sea una de las razones por las que no es una buena idea declarar clases en el espacio de nombres raíz). –

+0

Ah, se olvidó de usar el espacio de nombres raíz. Eso es ** así que ** ** mal ** Ni siquiera lo consideré. –

5

La clase estática sigue siendo una clase. Puede contener métodos, propiedades, etc. El espacio de nombres es solo un espacio de nombres. Es solo un ayudante para distinguir entre las declaraciones de clase con el mismo nombre.

La función no puede vivir solo en un espacio de nombres, pertenece a una clase.

Extensiones es probablemente lo que está buscando, si necesita una función estática sin mencionar el nombre de la clase.

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

Otra diferencia es que los espacios de nombres pueden abarcar varios ensamblajes, mientras que las clases no.

3

Por lo que tengo entendido, los espacios de nombres son solo una característica del idioma; se eliminan por compilación. En otras palabras, el tiempo de ejecución .NET no "ve" espacios de nombres, solo nombres de clase que contienen puntos. Por ejemplo, la clase String en el espacio de nombres System es vista por .NET runtime como una clase llamada System.String, pero no hay ningún concepto de espacio de nombres.

Las clases estáticas, sin embargo, son completamente entendidas y administradas por .NET runtime. Son tipos completamente desarrollados y puedes usar la reflexión sobre ellos.

Cuestiones relacionadas