Cómo trabajar con estructuras en C #

Si bien hay muchas similitudes entre una clase y una estructura, también existen algunas diferencias claras. Lo más importante es que una estructura, a diferencia de una clase, es un tipo de valor. Entonces, mientras que las instancias de una clase se almacenan en el montón, las instancias de una estructura se almacenan en la pila.

Cuando se pasa una instancia de una estructura a un método, siempre se pasa por valor. Esto contrasta con lo que sucede cuando pasamos una instancia de una clase a un método: la instancia se pasa por referencia.

Programación de estructuras en C #

Así es como se ve la sintaxis para declarar una estructura.

struct

{

//Data members and member functions of the struct

}

The following code snippet shows how a typical struct definition looks like.

struct Rectangle

    {

        public int width;

        public int height;

    }

Ahora puede asignar valores a los miembros de la estructura que ha definido anteriormente, como se muestra en el fragmento de código a continuación.

Rectangle rectangle = new Rectangle();

rectangle.width = 10;

rectangle.height = 15;

El fragmento de código anterior crea una instancia de la estructura Rectangle y asigna valores a los miembros públicos de la misma. Tenga en cuenta que puede tener datos de miembros y métodos dentro de una estructura. Además, puede especificar los miembros como privados, públicos e internos. Cabe señalar que, a diferencia de las clases, no puede tener inicializadores de campo para campos no estáticos en estructuras. Por lo tanto, declaraciones como las siguientes en una estructura no son válidas.

int width = 10;

int height = 15;

Puede inicializar miembros estáticos en sus estructuras de todos modos. Por lo tanto, la siguiente es una declaración válida dentro de una estructura.

static int area = 0;

Agreguemos ahora algunos métodos a la estructura. Aquí está la versión actualizada de la estructura Rectangle que creamos anteriormente. Tenga en cuenta el uso del constructor parametrizado.

struct Rectangle

    {

        int width;

        int height;

        public Rectangle(int width, int height)

        {

            this.width = width;

            this.height = height;

        }

        public int GetArea()

        {

            return this.width * this.height;

        }

    }

Tenga en cuenta que incluso si una estructura no le permite definir un constructor sin parámetros explícito dentro de ella, siempre puede tener constructores de parámetros dentro de una estructura. Además, de manera similar a una clase, también puede tener constructores sobrecargados en una estructura. Así es como puede establecer valores usando el constructor de la estructura Rectangle y luego obtener el área invocando el método GetArea (). Cabe señalar que, de forma similar a una clase, puede tener métodos estáticos y no estáticos dentro de una estructura.

static void Main(string[] args)

        {

            Rectangle rectangle = new Rectangle(10, 15);

            int area = rectangle.GetArea();

            Console.WriteLine("The area is: " + area.ToString());

            Console.Read();

        }

Como una clase, una estructura proporciona soporte para propiedades e indexadores. Una diferencia importante entre una estructura y una clase es que, a diferencia de una clase, una estructura no admite la herencia; no puede tener una estructura que amplíe otra clase o estructura. Sin embargo, similar a una clase, una estructura puede implementar una interfaz. Aquí hay un ejemplo de código que ilustra esto.

 interface IRectangle

    {

        int GetArea();

    }

  struct Rectangle : IRectangle

    {

        int width;

        int height;

        public Rectangle(int width, int height)

        {

            this.width = width;

            this.height = height;

        }

        public int GetArea()

        {

            return this.width * this.height;

        }

    }

Elegir entre una clase y una estructura

Ahora llegamos a un interesante punto de debate. ¿Cuándo deberíamos usar una estructura sobre una clase y viceversa?

Como comentamos anteriormente en este artículo, se crea una instancia de una estructura en la pila mientras que se crea una instancia de una clase en el montón administrado. La asignación y desasignación de tipos de valor son más económicas que los tipos de referencia. Una estructura es una buena opción cuando necesita crear un tipo de datos compuestos que contenga algunos miembros de datos. Idealmente, el tamaño de los miembros de datos de una estructura debería ser menor de 16 bytes. Puede optar por una estructura cuando desee construir una pequeña estructura de datos compuestos que tenga semántica de valor y contenga solo unos pocos miembros de datos. Al usar struct en tales casos, puede evitar la sobrecarga asociada con la recolección de basura.

Debe seguir las mejores prácticas recomendadas al trabajar con estructuras. Debe evitar usar una estructura de un tamaño mayor que el recomendado en este artículo. Además, tenga en cuenta que pasar instancias de estructuras a métodos es más costoso en términos de rendimiento que pasar instancias de clases. Es recomendable utilizar estructuras cuando trabaje con estructuras de datos pequeñas. Puede obtener más información sobre este tema en este artículo de MSDN.