2011-03-09 16 views
33

Tengo dos clases de Clase A y ClassB:¿Cuál es la diferencia entre los métodos estáticos en una clase no estática y los métodos estáticos en una clase estática?

static class ClassA 
    { 
     static string SomeMethod() 
     { 
      return "I am a Static Method"; 
     } 
    } 

    class ClassB 
    { 
     static string SomeMethod() 
     { 
      return "I am a Static Method"; 
     } 
    } 

Quiero saber cuál es la diferencia entre ClassA.SomeMethod(); y ClassB.SomeMethod();

Cuando ambos se puede acceder sin necesidad de crear una instancia de la clase, ¿por qué Necesitamos crear una clase estática en lugar de simplemente usar una clase no estática y declarar los métodos como estáticos?

Respuesta

32

La diferencia única es que los métodos estáticos en una clase no estática no pueden ser extension methods.


En otras palabras, esto no es válido:

class Test 
{ 
    static void getCount(this ICollection<int> collection) 
    { return collection.Count; } 
} 

mientras que esto es válido:

static class Test 
{ 
    static void getCount(this ICollection<int> collection) 
    { return collection.Count; } 
} 
13

Una clase estática sólo puede contener miembros estáticos.

Un método estático garantiza que, incluso si creara varios objetos de clase B, solo utilizaría una única función compartida de SomeMethod.

Técnicamente, no hay diferencia, excepto que el SomeMethod de ClassA debe ser estático.

0

un método estático pertenece a la clase y un método no estático pertenece a un objeto de una clase. Es decir, un método no estático solo se puede invocar en un objeto de una clase a la que pertenece. Un método estático solo puede acceder a miembros estáticos. Un método no estático puede acceder a los miembros estáticos y no estáticos porque en el momento en que se llama al método estático, la clase puede no crearse una instancia (si se llama a la clase en sí). En el otro caso, un método no estático solo puede invocarse cuando la clase ya ha sido instanciada. Un método estático es compartido por todas las instancias de la clase. Cada vez que se llama a un método en C++/Java/C#, se pasa un argumento implícito (la referencia 'this') junto con/sin los otros parámetros. En el caso de una llamada a un método estático, la referencia 'this' no se pasa porque los métodos estáticos pertenecen a una clase y, por lo tanto, no tienen la referencia 'this'.

+0

Cómo podemos llamar a un método estático desde un objeto de la clase, por favor dame un ejemplo – Vamsi

+0

"Sin embargo, se puede llamar a un método estático tanto en la clase como en un objeto de la clase."Creo que esta declaración es incorrecta. – Mahesh

2

Si tiene una clase no estática que contiene solo métodos estáticos, puede crear una instancia de esa clase. Pero no puedes usar esa instancia de manera significativa. NB: cuando no define un constructor, el compilador agrega uno para usted.

Una clase estática no tiene un constructor, por lo que no puede crear una instancia de la misma. Además, el compilador da un error cuando le agrega un método de instancia (donde se refería a un método estático).

Cuestiones relacionadas