2011-10-28 34 views
17

Duplicar posible:
When to Use Static Classes in C#C# clase estática ¿por qué usar?

me puso mis clases como un lote estático, pero no estoy seguro de que cuando un uso estático o no, o ¿cuál es la diferencia que hace a usarlo o no.

¿Alguien puede explicar por favor?

+1

clases/métodos estáticos son por ejemplo útiles para implementar el patrón Singleton y el patrón Factory ... – Yahia

+2

@Yahia: patrón Singleton con clases estáticas? [No lo creo.] (Http://stackoverflow.com/questions/3565482/can-singleton-class-be-static/3565496#3565496) – BoltClock

+0

@BoltClock SI lees cuidadosamente, escribí "clases estáticas/métodos "y estoy bastante seguro de que los métodos estáticos son útiles al implementar un patrón Singleton ... – Yahia

Respuesta

26

Hacer una clase estática solo evita que las personas intenten crear una instancia de la misma. Si toda su clase tiene miembros estáticos, es una buena práctica hacer que la clase en sí sea estática.

+5

¿Por qué es una buena práctica hacer que la clase sea estática si tenemos todos los miembros como estáticos? ¿Cuál será la ventaja de hacer que la clase misma sea estática? –

+2

Se evitará que las personas intenten crear una instancia –

+5

Pero para ello, puede declarar un constructor privado y crear la clase Singleton. Por lo que yo sé, una clase estática siempre permanecerá en la memoria creando una sobrecarga, pero las clases de singleton normales no lo harán. –

11

Si una clase se declara como estática, las variables y los métodos deben obligatoriamente declararse como estáticos.

Una clase se puede declarar estática, lo que indica que solo contiene miembros estáticos. No es posible crear instancias de una clase estática con la nueva palabra clave. El .NET Framework Common Language Runtime (CLR) carga automáticamente las clases estáticas cuando se carga el programa o el espacio de nombres que contiene la clase.

Utilice una clase estática para contener métodos que no están asociados con un objeto en particular. Por ejemplo, es un requisito común crear un conjunto de métodos que no actúen sobre datos de instancia y que no estén asociados a un objeto específico en su código. Podría usar una clase estática para contener esos métodos.

-> Las principales características de una clase estática son:

  • Sólo contienen los miembros estáticos.
  • No se pueden crear instancias.
  • Están sellados.
  • No pueden contener constructores de instancia o simplemente constructores, ya que sabemos que están asociados con objetos y operan en datos cuando se crea un objeto.

Ejemplo

static class CollegeRegistration 
{ 
    //All static member variables 
    static int nCollegeId; //College Id will be same for all the students studying 
    static string sCollegeName; //Name will be same 
    static string sColegeAddress; //Address of the college will also same 

    //Member functions 
    public static int GetCollegeId() 
    { 
    nCollegeId = 100; 
    return (nCollegeID); 
    } 
    //similarly implementation of others also. 
} //class end 


public class student 
{ 
    int nRollNo; 
    string sName; 

    public GetRollNo() 
    { 
     nRollNo += 1; 
     return (nRollNo); 
    } 
    //similarly .... 
    public static void Main() 
    { 
    //Not required. 
    //CollegeRegistration objCollReg= new CollegeRegistration(); 

    //<ClassName>.<MethodName> 
    int cid= CollegeRegistration.GetCollegeId(); 
    string sname= CollegeRegistration.GetCollegeName(); 


    } //Main end 
} 
+0

obligatoriamente obligatoriamente obligatoriamente obligatoriamente obligatoriamente obligatoriamente –

3

clases estáticas pueden ser útiles en ciertas situaciones, pero hay un potencial de abuso y/o abusar de ellos, como la mayoría de las características del lenguaje.

Como ya mencionó Dylan Smith, el caso más obvio para usar una clase estática es si tiene una clase con solo métodos estáticos. No tiene sentido permitirles a los desarrolladores crear una instancia de dicha clase.

La advertencia es que una sobreabundancia de métodos estáticos puede indicar un defecto en su estrategia de diseño. Me parece que cuando está creando una función estática, es bueno preguntarse: ¿sería más adecuado como a) un método de instancia o ob) un método de extensión para una interfaz? La idea aquí es que los comportamientos de los objetos generalmente están asociados con el estado del objeto, lo que significa que el comportamiento debe pertenecer al objeto. Al usar una función estática, implica que el comportamiento no debe pertenecer a ningún objeto en particular.

Los diseños polimórficos y de interfaz se ven obstaculizados por el uso excesivo de funciones estáticas: no se pueden anular en clases derivadas ni se pueden unir a una interfaz.Por lo general, es mejor tener sus funciones de "ayuda" vinculadas a una interfaz a través de un método de extensión para que todas las instancias de la interfaz tengan acceso a esa funcionalidad compartida de "ayuda".

Una situación en la que las funciones estáticas son definitivamente útiles, en mi opinión, es crear un método .Create() o .New() para implementar lógica para la creación de objetos, por ejemplo cuando se quiere utilizar el objeto creado

public class Foo 
{ 
    public static Foo New(string fooString) 
    { 
     ProxyGenerator generator = new ProxyGenerator(); 

     return (Foo)generator.CreateClassProxy 
      (typeof(Foo), new object[] { fooString }, new Interceptor()); 
    } 

Esto se puede utilizar con un marco proxy (como el castillo de proxy dinámico) en la que desea interceptar/inyectar funcionalidad en un objeto, en base a digamos, ciertos atributos asignados a sus métodos. La idea general es que necesita un constructor especial porque técnicamente está creando una copia de la instancia original con una funcionalidad adicional especial.