Utilizar estructuras (Guía de programación de C#)

Actualización: Julio de 2008

El tipo struct es adecuado para representar objetos de poca complejidad, como Point, Rectangle y Color. Aunque resulta igual de adecuado representar un punto como una clase con propiedades autoimplementadas, una estructura puede resultar más eficaz en algunos escenarios. Por ejemplo, si declara una matriz de 1000 objetos Point, asignará memoria adicional para hacer referencia a cada objeto; en este caso, una estructura sería menos costosa. Dado que .NET Framework contiene un objeto llamado Point, la estructura de este ejemplo se denomina "CoOrds".

public struct CoOrds
{
    public int x, y;

    public CoOrds(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}

Es un error definir un constructor predeterminado (sin parámetros) para una estructura. También es un error inicializar un campo de instancia en el cuerpo de una estructura. Solo puede inicializar los miembros de una estructura utilizando un constructor con parámetros o mediante el acceso de forma individual a los miembros una vez declarada la estructura. Los miembros privados o inaccesibles de cualquier modo solo se pueden inicializar en un constructor.

Cuando se crea un objeto struct mediante el operador new, se crea y se llama al constructor apropiado. A diferencia de las clases, es posible crear instancias de las estructuras sin utilizar el operador new. En este caso, no hay ninguna llamada de constructor, lo que hace que la asignación sea más eficaz. Sin embargo, los campos permanecerán sin asignar y el objeto no se podrá utilizar hasta haber inicializado todos los campos.

Cuando una estructura contiene un tipo de referencia como miembro, el constructor predeterminado del miembro se debe invocar explícitamente, de lo contrario el miembro seguirá sin asignar y no se podrá utilizar la estructura. (Esto produce el error del compilador CS0171.)

A diferencia de las clases, para las estructuras no existe herencia. Una estructura no puede heredar de otra estructura o clase, ni puede ser la base de una clase. Sin embargo, las estructuras heredan de la clase base Object. Una estructura puede implementar interfaces del mismo modo que las clases.

A diferencia de C++, no se puede declarar una clase mediante la palabra clave struct. En C#, las clases y las estructuras son semánticamente diferentes. Una estructura es un tipo de valor, mientras que una clase es un tipo de referencia. Para obtener más información, vea Tipos de valores (Referencia de C#).

A menos que se necesite semántica de tipo de referencia, el sistema puede controlar más eficazmente las clases pequeñas si se definen como estructuras.

Ejemplo 1

Description

Este ejemplo muestra la inicialización de tipo struct mediante constructores predeterminados y constructores con parámetros.

Code

public struct CoOrds
{
    public int x, y;

    public CoOrds(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}
// Declare and initialize struct objects.
class TestCoOrds
{
    static void Main()
    {
        // Initialize:   
        CoOrds coords1 = new CoOrds();
        CoOrds coords2 = new CoOrds(10, 10);

        // Display results:
        Console.Write("CoOrds 1: ");
        Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);

        Console.Write("CoOrds 2: ");
        Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    CoOrds 1: x = 0, y = 0
    CoOrds 2: x = 10, y = 10
*/

Ejemplo 2

Description

Este ejemplo muestra una característica exclusiva de las estructuras. Crea un objeto CoOrds sin utilizar el operador new. Si se reemplaza la palabra struct por la palabra class, el programa no se compilará.

Code

public struct CoOrds
{
    public int x, y;

    public CoOrds(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}
// Declare a struct object without "new."
class TestCoOrdsNoNew
{
    static void Main()
    {
        // Declare an object:
        CoOrds coords1;

        // Initialize:
        coords1.x = 10;
        coords1.y = 20;

        // Display results:
        Console.Write("CoOrds 1: ");
        Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output: CoOrds 1: x = 10, y = 20

Vea también

Conceptos

Guía de programación de C#

Referencia

Clases y estructuras (Guía de programación de C#)

Estructuras (Guía de programación de C#)

Historial de cambios

Fecha

Historial

Motivo

Julio de 2008

Se ha agregado un párrafo sobre CS0171

Corrección de errores de contenido.