2010-02-11 15 views
21

En C#, ¿cuál es el propósito de marcar una clase estática?En C#, ¿cuál es el propósito de marcar una clase estática?

Si tengo una clase que solo tiene métodos estáticos, puedo marcar la clase estática o no. ¿Por qué querría marcar la clase estática? ¿Alguna vez NO quisiera marcar una clase estática, si todos los métodos son estáticos, y si planeo nunca agregar un método no estático?

Miré a mi alrededor y vi algunas preguntas similares, pero ninguna que fuera así.

+0

http://stackoverflow.com/questions/576853/what-is-the-use-of-a-static-class http://stackoverflow.com/questions/241339/when-to-use-static- classes-in-c –

+0

Haga su propia pregunta, @dboarman! – Cheeso

+0

no se preocupe, no quisiera contaminar su pregunta. Pensé que alguien podría comentar sobre la seguridad de subprocesos de los miembros estáticos. ;) – IAbstract

Respuesta

26

Marcar una clase como estática es una declaración declarativa de que solo tiene la intención de que este tipo tenga miembros estáticos y const. Esto es impuesto por el compilador e impide que agregue accidentalmente un método de instancia al tipo.

Otras ventajas

  • Los métodos de extensión sólo se pueden definir en las clases estáticas
  • impide a los usuarios crear una instancia de la clase
  • impide el uso del tipo como un argumento genérico (gracias Eric!)
+8

También evita que los consumidores creen una instancia de la clase. Antes de la introducción de clases estáticas, tenía que crear un constructor privado sin argumentos para aplicar esto. –

+0

@Joel, gracias actualizado con esto – JaredPar

+6

Incidentalmente, hacer una clase estática también evita el uso del tipo como un argumento de tipo genérico en una clase genérica, estructura, interfaz, delegado o método. (¿Qué harías con un tipo como un argumento de tipo genérico? No puedes crearlo, por lo que ninguna variable de ese tipo sería alguna vez no nula. No puedes llamar a métodos estáticos a través de un parámetro de tipo. completamente inútil, entonces no lo permitimos.) –

6

Si desea escribir métodos de extensión, debe usar una clase estática. De lo contrario, es para mostrar que la clase nunca tendrá datos de instancia.

1

Marque una clase estática si desea obligarla a contener solo métodos estáticos, una clase auxiliar típica. Si coloca un método de instancia, el compilador se quejará, esto es bueno. En la versión 1 del .NET framework había una clase, no recuerdo cuál, que se enviaba con solo métodos estáticos. Accidentalmente uno de esos métodos no obtuvo el modificador estático. Porque esta característica no existía en el momento en que se detectó el error muy tarde, después del envío. Hicieron privado al constructor y, como tal, no se pudo usar el método.

5

Es una convención específica del lenguaje C#, el CLR no tiene noción de clases estáticas. Asegura que no puede agregar accidentalmente un miembro de instancia en la clase, no puede heredar la clase y el código del cliente no puede crear accidentalmente una instancia de la clase. Los TypeAttributes subyacentes para la clase son Abstract y Sealed. Abstract garantiza que el nuevo operador no puede funcionar, Sealed garantiza que no puede heredar de la clase.

También por convención, los métodos de extensión deben ser miembros estáticos de una clase estática. VB.NET lo hace de manera diferente, requiere el atributo [Extensión].

No es necesario utilizar clases estáticas en el código, pero es útil. Su contrato es muy descriptivo, hace que su código sea más fácil de entender. Pero tenga cuidado de no utilizarlos como un vehículo para escribir código de procedimiento en lugar de código OOP.

+0

+1 para detalles de implementación y mencionar el uso excesivo para escribir código de procedimiento. – si618

7

Marcar una clase como static te ofrece dos cosas importantes.

  • verificación Compilador que sólo se pone static miembros de una clase.

  • Una declaración obvia para los lectores de su código que esta clase es solo un contenedor para static miembros.

La característica fue inventado en respuesta a un error en NDP v1.0, donde a un-callable non-static member was included in the System.Environment class.

+0

Aparte: he deseado un modificador 'readonly' similar en los tipos, que requiere que todos los campos se marquen como' readonly' y que sean de tipos que estén marcados 'readonly'. El NDP debería anotarse en consecuencia, especialmente los tipos primitivos. Lamentablemente, existe un gran cuerpo de código escrito con modismos mutables (por ejemplo, 'List ', por lo que es demasiado tarde. –

Cuestiones relacionadas