// OK
struct MyStruct
{
static void Foo() { }
}
// Error
static struct MyStruct
{
}
Respuesta
Dado que no puede crear una instancia de un tipo estático, el comportamiento de static struct
sería exactamente el mismo que el comportamiento de static class
. Entonces, no hay razón para crearlos. Creo que sería teóricamente posible tener un static struct
, pero sería confuso: ¿cómo elegirías entre static class
y static struct
si el comportamiento de los dos fuera exactamente el mismo?
Tenga en cuenta que static
métodos dentro de una estructura son bastante útil ya que puede usarlos para operaciones relacionadas con la estructura, por ejemplo DateTime.TryParse
etc.
Técnicamente hablando No creo que la corriente compilador de C# & el tiempo de ejecución podría producir algo así como un static struct
, porque internamente (en el nivel IL) static class
es una clase que está marcada como abstract
y sealed
. Y supongo que no puede crear un struct
que sería abstract
y sealed
(en el IL).
Creo que la clave, realmente, es que una estructura es un tipo de valor, no un tipo de referencia. Eso sería como decir "Solo hay una instancia de int
para todo mi programa. Puede tener diferentes valores, pero solo uno a la vez". Además, cada vez que pasa una estructura como argumento, se pasa por valor, es decir, se hace una copia de la estructura y se coloca en la pila. Esto frustra el propósito de una definición estática, lo que debería significar que solo hay (alguna) instancia de la cosa que se está definiendo. Si lo que estás tratando de crear es realmente un Singleton, una clase es una forma mucho mejor de manejarlo dado que tiene una semántica de creación mucho mejor que una estructura.
El punto clave aquí es que la estática modificada en una clase impone (entre otras cosas) que no se pueda crear una instancia de la clase. Esto se hace forzando a un constructor privado.
El CLR no tiene forma de evitar que se cree una instancia de tipo de estructura. Incluso si no hay un constructor público predeterminado, simplemente declarando
struct S { }
S[] items = new S[]{1};
crearía una instancia de la estructura con toda la memoria asociada se establece en cero bits.
Esto es diferente de un tipo de referencia (clase) donde el mismo código crearía una referencia del tipo especificado (que hace referencia a ningún objeto aka null) pero no una instancia del objeto en sí.
- 1. ¿Por qué una clase interna no estática no puede tener miembros estáticos (campos y métodos)?
- 2. ¿Por qué no puedo declarar métodos estáticos en una interfaz?
- 3. ¿Por qué las clases estáticas no pueden tener métodos y variables no estáticos?
- 4. ¿Por qué las clases internas no pueden declarar miembros estáticos?
- 5. ¿Por qué declarar una variable o función estática en C?
- 6. ¿Por qué las estructuras no pueden tener propiedades externas, pero los métodos son correctos?
- 7. ¿Por qué tienen todos los métodos/variables estáticos en una clase no estática?
- 8. ¿Por qué las clases estáticas solo pueden tener miembros estáticos?
- 9. xCode/declarar métodos estáticos en la clase
- 10. ¿Por qué podemos tener miembros finales estáticos pero no podemos tener un método estático en una clase interna?
- 11. ¿Por qué no podemos declarar una variable estática dentro de una estructura en el lenguaje de programación C?
- 12. ¿Cuál es la diferencia entre los métodos estáticos en una clase no estática y los métodos estáticos en una clase estática?
- 13. ¿Por qué es imposible declarar métodos de extensión en una clase genérica estática?
- 14. Cómo declarar una variable estática pero no definirla
- 15. cómo inicializar una estructura estática en C++?
- 16. Estructura estática en C++
- 17. C#: ¿Por qué no podemos tener métodos internos/funciones locales?
- 18. ¿Por qué los métodos de interfaz no pueden ser "estáticos" y "finales"?
- 19. Alternativa a C++ estática métodos virtuales
- 20. Reenviar declarar una estructura en Objective-C
- 21. Los métodos estáticos en C++
- 22. PHP: ¿por qué no pude declarar la variable const estática?
- 23. Métodos estáticos de Python, ¿por qué?
- 24. métodos abstractos estáticos en C++
- 25. estructura estática en C/C++
- 26. ¿Por qué no se pueden inicializar campos no estáticos dentro de las estructuras?
- 27. ¿Por qué no puedes UnRegisterStartupScript?
- 28. ¿Por qué se pueden publicar algunas matrices pero no otras?
- 29. ¿Por qué los operadores no pueden estar sobrecargados dentro de una clase estática?
- 30. ¿Qué significa redefinir los métodos estáticos en Java?
Igual para [delegados] (http://stackoverflow.com/questions/6835766/why-can-a-net-delegate-not-be-declared-static) y [enums] (http: // stackoverflow.com/questions/4567868/troubles-declaring-static-enum-c-sharp) – nawfal