2008-11-27 10 views

Respuesta

23

Las clases estáticas se cierran automáticamente, por lo que las personas no pueden heredar y anular su comportamiento.

Esa es la única diferencia real (a menos que haya algo especial en el IL)

tanto, si utiliza una clase estática, se ahorra la molestia de hacer que el constructor privado, y la declaración de la clase sellada.

Yo agregaría, que definir una clase como estática, es un código "autodocumentado". Los usuarios de su biblioteca sabrán que esta clase no se debe instanciar, y solo tiene valores estáticos.

+2

Realmente hay algo especial en la IL. Las clases estáticas están marcadas como abstractas y selladas (lo que no se puede hacer desde C#), lo que impide completamente la creación de instancias. –

+3

Tenga en cuenta que de acuerdo con Mehrdad ([aquí] (http://stackoverflow.com/questions/5241899/what-is-the-difference-between-static-methods-in-a-non-static-class-and-static -me/5241927 # 5241927)), otra diferencia es que los métodos estáticos en clases no estáticas no pueden ser métodos de extensión. – Benjol

17

Una clase estática nunca se puede crear una instancia. De ninguna manera, no cómo.

Una clase no estática con un constructor privado, pero todos los métodos estáticos se pueden abusar de varias maneras: herencia, reflexión, llamar al constructor privado en una fábrica estática, para instanciar la clase.

Si nunca quiere instanciación, me gustaría ir con la clase estática.


Editar - Aclaración para el comentario de FosterZ

Digamos que tiene esta clase de utilidad:

public class Utility 
{ 
    public static string Config1 { get { return "Fourty Two"; } } 

    public static int Negate(int x) { return -x; } 

    private Utility() { }  
} 

Si otro desarrollador no es claro en su intención, podrían hacer esto:

public class Utility 
{ 
    public static string Config1 { get { return "Fourty Two"; } } 
    public int Config2 { get; set; } 

    public static int Negate(int x) { return -x; } 

    private Utility() { } 

    /// Get an instance of Utility  
    public static Utility GetUtility() 
    { 
     return new Utility(); 
    } 
} 

Ahora tiene un Frankenstei n clase. Algunas de sus características requieren instanciación y otras no. Tal vez eso es lo que quieres, pero tal vez no lo es. Podría evitar esto con la revisión del código, pero ¿por qué no hacer explícitas sus intenciones en el código? Marcar la clase como static elimina cualquier posible confusión. No puede instanciar una clase estática o heredar de ella.

+0

puede darme un pequeño ejemplo para este punto "llame al constructor privado en una fábrica estática - para crear una instancia de la clase", m resulta difícil de entender esto ... – FosterZ

+2

@FosterZ - He añadido un ejemplo a mi respuesta. Aclamaciones. –

+0

thnku mucho tio .... ahora lo entiendo ... – FosterZ

15

Además de las respuestas anteriores: El compilador no permitirá miembros no estáticos en clases estáticas y produce errores. Esto puede ayudar un poco a no agregar accidentalmente miembros no estáticos.

1

También voy a ir con el constructor privado que nunca es llamado por los métodos estáticos. Entonces, cualquier inicialización sería desperdiciada ... Pero eso es solo una teoría.

3

puede pasar el objeto de una clase que tiene un constructor privado como parámetro para cualquier método pero no puede hacer lo mismo con la clase estática. Esta es la gran diferencia.

Cuestiones relacionadas