2010-04-10 15 views
28
// OK 
struct MyStruct 
{ 
    static void Foo() { } 
} 

// Error 
static struct MyStruct 
{ 
} 
+0

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

Respuesta

36

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).

11

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.

3

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í.

Cuestiones relacionadas