2009-08-14 4 views
8

La sintaxis tal vez equivocadaC# ¿Cuál es la diferencia entre la clase estático y no estático (estoy hablando de la misma no la clase del campo)

public static class Storage 
     { 
       public static string filePath { get; set; } 
     } 

Y

public class Storage 
    { 
     private void Storage() {}; 
     public static string filePath { get; set; } 
    } 

llegué esto desde un ejemplo en internet. ¿de qué sirve el segundo?

+0

@Tuzo - No duplicados relacionados .. Esa pregunta es una comparación – Gishu

+0

@OP - Creo que su segundo fragmento de código debe ser vacío de almacenamiento privado() {}; ... como en privado ctor – Gishu

+0

@Gishu Lo siento. Tienes razón :) pero aún así todos lo saben, editándolo. –

Respuesta

12

Si nos fijamos en el código IL, la clase estática será abstract y sealed que da dos cualidades importantes:

  • No se puede crear instancias de ella
  • No puede ser heredada

Una consecuencia del primer punto es que una clase estática no puede contener miembros no estáticos. Puede haber muchos usos de miembros estáticos en una clase no estática. Un uso común es tener un generador de clases:

public class SomeClass 
{ 
    public int SomeInt { get; set; } 

    public static SomeClass Create(int defaultValue) 
    { 
     SomeClass result = new SomeClass(); 
     result.SomeInt = defaultValue; 
     return result; 
    } 
} 
+1

¿Eh? Tu ejemplo no es una clase estática? – Thorarin

+0

¿No es una clase estática? – Svish

+4

@Thorarin y @Svish: eso es correcto. Sirve para responder la última pregunta sobre el uso de miembros estáticos en tipos no estáticos (como interpreté la pregunta anterior en la publicación original) –

3

Muchas clases tienen métodos de instancia y estáticos. Cadena, por ejemplo, cuenta con:

String.Format(string, arg0, arg1, arg2) // static method 

Y

String myString = " Hello world!"; 
myString = myString.Substring(4);  // instance method 

Si estás preguntando por qué tanto la clase y el método necesitan la palabra clave estática es simplemente por diseño. Veo lo que estás preguntando, si la clase es estática, por supuesto, todos los métodos son estáticos también, parece redundante ponerla allí dos veces. No sé si hay una buena razón para eso o no.

2

Cuando se declara una clase como estática:

  • Está permitido tener sólo los miembros estáticos,
  • Se no puede se instanciará (no tiene constructor público) y
  • No no se puede heredar (está sellado).

Cualquier clase que no esté declarada como estática se puede instanciar, heredar y puede tener miembros no estáticos.

5

Aquí es el funcionario/MSDN punto caliente para aprender sobre static classes

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 Instancia de constructores

Básicamente una clase estática es idéntica a una clase 'normal'/no estático que tiene sólo métodos estáticos y una ctor privado. Marcarlo como estático ayuda a aclarar la intención y ayuda al compilador a hacer algunas comprobaciones en tiempo de compilación para no permitir ciertas cosas, p. no permitir la creación de instancias

mundo real utiliza se me ocurre: se utiliza para albergar o como una forma de organizar

  • métodos de utilidad (métodos que no están asociados con cualquier instancia de un tipo), por ejemplo, Matemáticas para los métodos Min y Max
  • métodos de extensión, p. StopWatchExtensions para un método de reinicio en un cronómetro
3

Las clases estáticas solo están disponibles desde C# 2 hacia arriba. En C# 1, tendría que sellar su clase y especificar que no es instanciable agregando un constructor privado para obtener este tipo de comportamiento.

1

Una clase estática es básicamente la misma que una clase no estática, pero hay una diferencia: no se puede crear una instancia de una clase estática. En otras palabras, no puede usar la nueva palabra clave para crear una variable del tipo de clase. Como no hay una variable de instancia, puede acceder a los miembros de una clase estática utilizando el nombre de la clase en sí.

public static class Storage 
     { 
       public static string filePath { get; set; } 
     } 

en esto, la clase no tiene por qué ser instantiate.so mismo con la ruta de archivo, que ocupará valor único de almacenamiento de clase para todos los objetos.

public class Storage 
    { 
     private void Storage {}; 
     public static string filePath { get; set; } 
    } 

en esto, la clase no es estática, tienen que ser una instancia

0

Como sabemos las variables y las funciones son de dos tipos instancia y de clase.

Una clase estática -tiene solo variables de clase sin variables de instancia.

Por lo tanto, no se puede crear una instancia, solo se puede acceder mediante Classname.method().

Contiene solo constructores privados no hay constructor público.

Una clase estática contiene solo miembros estáticos.

Cuestiones relacionadas