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#?
Respuesta
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.
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.
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.
- 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.)
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
- 1. Clases selladas abstractas
- 2. ¿Por qué declarar las clases Mapper y Reducer como estáticas?
- 3. ¿Por qué las clases no están selladas por defecto?
- 4. ¿Por qué Android prefiere las clases estáticas
- 5. ¿Las clases abstractas pueden implementarse en C#?
- 6. ¿Por qué las clases abstractas en Java tienen constructores?
- 7. declaraciones de clases abstractas en C++
- 8. C#: ¿Las clases abstractas necesitan implementar interfaces?
- 9. ¿Por qué crear clases e interfaces abstractas?
- 10. Clases abstractas, ¿por qué no podemos declarar val privado y miembro de la clase var?
- 11. JAXB y clases abstractas
- 12. ¿Podemos crear clases abstractas estáticas públicas en java?
- 13. clases estáticas en C#
- 14. Una pregunta sobre C# y las clases y funciones estáticas
- 15. Cómo crear propiedades abstractas en las clases abstractas de Python
- 16. ¿Por qué las clases estáticas solo pueden tener miembros estáticos?
- 17. ¿Por qué se usan clases estáticas?
- 18. ¿Constructores en clases abstractas?
- 19. Java: variables finales en las clases abstractas
- 20. ¿Por qué no se permite que las clases selladas sean restricciones de tipo genérico?
- 21. ¿Por qué no serializar clases abstractas en Java?
- 22. ¿Por qué las estructuras estáticas no están permitidas en C#?
- 23. ¿Por qué las clases internas no pueden declarar miembros estáticos?
- 24. ¿Cómo declarar variables estáticas en Objective-C?
- 25. ¿Por qué las uniones anónimas globales deben declararse como estáticas?
- 26. ¿Debería evitar las clases estáticas?
- 27. ¿Cuáles son las palabras clave 'ref' y 'selladas' en C++?
- 28. Activador y clases estáticas
- 29. Las variables estáticas en C y C++
- 30. excepciones como clases públicas frente a las clases internas estáticas públicas
Esa parte de la frase explícitamente se refiere a otros lenguajes además de C# –
@HenkHolterman y VB.NET también, ya que MustInherit y NotInheritable no se pueden usar juntos. –