2009-08-12 17 views
6

This MSDN article indica que las clases estáticas deben declararse como selladas y abstractas. Tenía la impresión de que las clases estáticas ya estaban selladas. ¿Por qué también necesitarías declarar una clase estática como sellada?¿Por qué declarar las clases estáticas como selladas y abstractas en C#?

+5

Esa parte de la frase explícitamente se refiere a otros lenguajes además de C# –

+0

@HenkHolterman y VB.NET también, ya que MustInherit y NotInheritable no se pueden usar juntos. –

Respuesta

23

creo que el bit correspondiente de ese artículo es:

"declaramos clases estáticas como sellado y abstracta, y añadir un constructor de instancia privada, si su lenguaje de programación no cuenta con soporte integrado para las clases estáticas "

Recuerde, el .NET Framework es compatible con muchos idiomas diferentes.

0

Parece estar diciendo que declarar una clase como sellada y abstracta con un constructor privado es una alternativa a la clase estática si el lenguaje no admite clases estáticas.

16

C# v1 no permitió la palabra clave 'estática' en la clase. Entonces, si tienes una clase con solo métodos estáticos, se sugirió declararla 'sellada', 'abstracta' y hacer que el constructor sea privado. Esto significa que nadie puede instanciar su clase o tratar de heredar de ella. [No tiene sentido heredar de una clase que solo tiene métodos estáticos.]

C# v2 permitió la palabra clave estática en una clase, por lo que no tiene que usar el truco anterior para imponer el uso correcto.

11
  • Uno de los efectos de marcar una clase como abstract es que no se puede crear una instancia.
  • Uno de los efectos de marcar una clase como sealed es que no se puede heredar.

Eso es lo que realmente es una clase static - una clase que no puede ser instanciada y que no puede ser heredada.

Por lo que el artículo no indica que debe marcar sus clases estáticas como abstract y sealed adicionalmente, pero esta es la forma en que las clases estáticas están representadas en IL.

(otros idiomas pueden permitirle hacer esto si no tienen una palabra clave static, aunque lo dudo, porque una clase abstract sealed no tiene mucho sentido semántico.)

+0

Desea agregar para futuros viajeros que en 4.0 IL, utilizando estática, obtiene algo como '.class private auto ansi sealed'. Entonces sí, su respuesta es el * por qué *. En C# con estática, elimina cualquier constructor predeterminado que se haya generado para ti en IL ya que en C# no se puede heredar. Así que estático en C# es 'preferido', simplemente complete algunas de las respuestas anteriores. – Celess

Cuestiones relacionadas