2010-09-16 20 views
9

Siempre solía considerar las estructuras como algo menos privilegiado, o algo con características menores. Tal vez debido a los conceptos de OOP que soplan todo en Clases.¿Por qué las estructuras estáticas no están permitidas en C#?

Desde la poca cantidad de exposición a C#, entiendo que al establecer una clase estática, me aseguro de que todas las funciones de los miembros & sean estáticas. Además, no podemos tener un constructor para inicializar esa clase, ya que solo hay una sola instancia.

public static struct mystruct 
{ 
    public static int a; 
} 

Me señalaron aquí en el desbordamiento de la pila que este es un método incorrecto. ¿Puede alguien elaborar?

Recibí el error apropiado diciendo "static no es válido para este elemento" cuando creé un nuevo archivo cs & compilado en la consola. Extrañamente cuando agregué esto a un proyecto de trabajo existente para ver si el compilador se quejaba, pero para mi sorpresa, no es así. ¿Alguna razón para esto?

+6

En C#, 'static' es un alias de' sealed' abstracto en una declaración de tipo (que también permite algunas otras comprobaciones en tiempo de compilación, tales como asegurarse de que los métodos son estático también). Como las estructuras son tipos de valores y no permiten el comportamiento polimórfico, entonces tiene sentido por qué 'static 'no está permitido. Sin embargo, puede tener miembros estáticos en una estructura. –

+2

@Steve: si la clase es estática, el compilador también verifica el * uso * del nombre del tipo. Por ejemplo, no puede declarar un parámetro de tipo Enumerable. Puede que ya lo hayas notado, pero quería llamar la atención :) –

+0

@Jon: Es correcto, gracias por recordarme eso. –

Respuesta

17

Una clase estática es solo un contenedor para miembros estáticos (de cualquier tipo: campos, eventos, propiedades y, por lo general, métodos).

Una estructura estática sería exactamente la misma, por lo que no proporcionaría ninguna ventaja, pero los lectores podrían pensar que tenía algún significado especial. Para evitar confusiones, por lo tanto está prohibido. Conceptualmente tiene tanto sentido como una clase estática, por supuesto, la diferencia entre las estructuras y las clases es realmente en términos de cómo se comportan instancias, y como no habría instancias de tipos estáticos de ningún tipo, esa diferencia sería discutible

(No es que estuviera en la reunión de diseño donde se decidió esto, por supuesto. Eric Lippert bien podría encontrar algunas notas al respecto. Lo anterior es solo una conjetura. La nota anotada C# 3 no dice nada el asunto, por lo que puedo ver.)

+2

¿Quiere decir que no estaba * en la reunión de diseño? –

+1

@Dan: Desgraciadamente, nunca he estado en ninguna reunión de diseño de C#. Me gustaría * amar * ser, por supuesto. –

+0

@Jon: Lo siento, acabo de leer la oración equivocada la primera vez. Personalmente, creo que * odio * estar en tal reunión ... ¡demasiada presión para tomar decisiones inteligentes! –

8

Esto no logra nada. Aún tendrías una colección de métodos estáticos tal como lo haces con una clase estática. Una estructura en C# implica que es un tipo de valor en lugar de un tipo de referencia, que no tiene ningún significado en el nivel estático.

1

El concepto de tipos estáticos no tiene sentido para las estructuras. Las estructuras implican una semántica de copia por valor, que solo tiene sentido cuando se puede crear una instancia de un tipo. Las clases estáticas se introdujeron para facilitar la agrupación de métodos estáticos en un tipo que no se puede instanciar. Permitir estructuras estáticas sería redundante y confuso.

Piénselo de esta manera. ¿Cómo se diferencian en el comportamiento static class Foo y static struct Foo? Y si no lo hacen ... ¿por qué introducir un concepto static struct? Solo podría confundir a las personas para que piensen que existe una diferencia ...

+0

Entiendo tu punto. Pero seguramente "clase" implica semántica copia por referencia, capacidad de crear instancias y compartir detalles de implementación a través de la herencia, ninguno de los cuales es cierto para las clases estáticas. No es del todo obvio que la clase estática es * mejor * que la estructura estática, y es posiblemente peor. –

+0

@Eric: De hecho lo hace ... y tal vez un tercer tipo de concepto (módulo como mencionas en tu comentario a la publicación de Jon) puede haber sido mejor. Creo que lo que estaba tratando de decir (pobremente) es que tener * tanto * clase estática y estructura estática sería confuso e implicaría una diferencia de comportamiento que no existía. – LBushkin

1

Porque estático no está definido para estar permitido en el lenguaje que se aplicará a las estructuras.

clase estática ya define la misma capacidad.

+0

alguna razón para el antiguo enlace? –

+0

@John: Gracias por señalar eso. Corregido mediante su eliminación.Justo lo primero que apareció en Google cuando busqué la página de referencia. –

3

Archivo que bajo "así es como es". Como puede hacerlo con una clase estática, no hay razón para permitir estructuras estáticas. Simplemente confundiría a las personas sobre cuál es la diferencia entre ellos. Tuvieron que elegir uno o el otro.

3

Also we cannot have a constructor to initialize that class as there is only a single instance.

En realidad, no existe ningún instancia de una clase estática. Que tipo de explica la falta de soporte para las estructuras estáticas, o más bien, la falta de cualquier necesita para tal cosa.

La distinción entre los tipos de referencia y los tipos de valor en .NET (class y struct en C#) es del todo acerca de cómo casos de estos tipos se manejan. Se accede a una instancia de un tipo de referencia a través de una referencia a esa instancia en forma de una variable. Las copias a tales referencias se pasan entre las llamadas al método. Se accede directamente a una instancia de un tipo de valor y se pasan copias de la instancia entre llamadas de método.

Sin ningún caso para hablar, esta distinción se vuelve irrelevante; por lo tanto, cualquier tipo que consista exclusivamente en miembros estáticos podría ser una clase estática.

3

ningún caso Inicializadores campo

en una clase se nos permite crear un campo/variable y inicializarlo al mismo tiempo, una estructura no puede contener tales inicialización. Estos campos se deben inicializar a través de funciones o mediante el uso del objeto en sí. A los campos no se les pueden dar valores iniciales en el momento de la creación. El código siguiente da un error:

struct Point 
{ 
    public int x = 20; // Error its not possible to initialize 
    public int y=20; // Error its not possible to initialize 
} 

Sin embargo una estructura puede contener campos estáticos, que pueden ser inicializados dentro de la estructura. El siguiente ejemplo muestra el uso de campos estáticos dentro de una estructura.

struct Point { 
     public static int x = 25; 
     public static int y = 50; 
} 

Struct & Métodos

A C# struct también puede contener métodos. Los métodos pueden ser estáticos o no estáticos. Pero los métodos estáticos solo pueden acceder a otros miembros estáticos y no pueden invocar utilizando un objeto de la estructura. Solo pueden invocar utilizando el nombre de la estructura.

struct Point 
{  
    static int x = 25;  
    static int y = 50; 
    public void SetXY(int i, int j)  
    {   
     x = i;   
     y = j;  
    }  

    public static void ShowSum()    
    {   
     int sum = x + y;   
     Console.WriteLine("The sum is {0}",sum);  
    } 
} 

tal como se encuentra en "http://www.csharpfriends.com/articles/getarticle.aspx?articleid=120"

Cuestiones relacionadas