Compartir a través de


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

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, un elemento struct 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, un struct sería menos costosa. Dado que .NET Framework contiene un objeto llamado Point, el struct 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 un struct. También es un error inicializar un campo de instancia en el cuerpo de un struct. Solo puede inicializar los miembros de un struct utilizando un constructor con parámetros o mediante el acceso de forma individual a los miembros una vez declarado el struct. 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 los structs 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 un struct 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 el struct. (Esto produce el error del compilador CS0171.)

A diferencia de las clases, para los structs no existe herencia. Un struct no puede heredar de otro struct o clase, ni puede ser la base de una clase. Sin embargo, los structs heredan de la clase base Object. Un struct puede implementar interfaces del mismo modo que las clases.

No se puede declarar una clase mediante la palabra clave struct. En C#, las clases y los structs son semánticamente diferentes. Un struct es un tipo de valor, mientras que una clase es un tipo de referencia. Para obtener más información, vea Tipos de valor (Referencia de C#).

A menos que se necesite semántica de tipo de referencia, el sistema puede controlar más eficazmente una clase pequeña si se declara como struct.

Ejemplo 1

Descripción

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

Código

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

Descripción

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

Código

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

Referencia

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

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

Conceptos

Guía de programación de C#