Condividi tramite


Utilizzo di strutture (Guida per programmatori C#)

Aggiornamento: Luglio 2008

Il tipo struct è adatto alla rappresentazione di oggetti leggeri quali Point, Rectangle e Color. Sebbene sia altrettanto comodo rappresentare un punto come una classecon proprietà implementate automaticamente, una struttura potrebbe essere più efficiente in alcuni scenari. Se ad esempio si dichiara una matrice di 1.000 oggetti Point, si allocherà ulteriore memoria per i riferimenti a ciascun oggetto. In questo caso la struttura risulta meno onerosa. Poiché .NET Framework contiene un oggetto denominato Point, la struttura in questo esempio è invece denominata "CoOrds".

public struct CoOrds
{
    public int x, y;

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

È errato definire un costruttore predefinito (senza parametri) per una struttura. È inoltre un errore inizializzare un campo di istanza nel corpo di una struttura. I membri di una struttura possono essere inizializzati solo tramite un costruttore con parametri o accedendo individualmente ai membri dopo la dichiarazione della struttura. Qualsiasi membro privato o altrimenti inaccessibile può essere inizializzato solo in un costruttore.

Quando si crea un oggetto struttura mediante l'operatore new, viene creato l'oggetto e viene chiamato il costruttore appropriato. A differenza delle classi, è possibile creare istanze di oggetti struttura senza utilizzare l'operatore new. In tal caso, non esiste alcuna chiamata del costruttore, cosa che rende l'allocazione più efficiente. Tuttavia, i campi rimangono non assegnati e non è possibile utilizzare l'oggetto finché tutti i campi non vengono inizializzati.

Quando una struttura contiene un membro di tipo riferimento, il costruttore predefinito del membro deve essere chiamato in modo esplicito, altrimenti il membro rimarrà non assegnato e la struttura non potrà essere utilizzata. (Questo causa l’errore del compilatore CS0171.)

A differenza delle classi, non esiste ereditarietà per le strutture. Una struttura non può ereditare da un'altra struct o da un'altra classe né può costituire la base di una classe. Le strutture ereditano tuttavia dalla classe base Object Le strutture consentono, con le medesime modalità delle classi, l'implementazione delle interfacce.

A differenza di C++, non è possibile dichiarare una classe mediante la parola chiave struct. In C# classi e strutture sono, dal punto di vista semantico, differenti. Una struttura è un tipo di valore, mentre una classe è un tipo di riferimento. Per ulteriori informazioni, vedere Tipi di valore.

A meno che non sia necessaria una semantica dei tipi di riferimento, una classe piccola può essere gestita dal sistema più efficacemente di una struttura.

Esempio 1

Descrizione

In questo esempio viene illustrata l'inizializzazione di struct tramite costruttori sia predefiniti che con parametri.

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
*/

Esempio 2

Descrizione

In questo esempio viene illustrata una caratteristica specifica delle struct. Viene creato un oggetto CoOrds senza utilizzare l'operatore new. Se si sostituisce la parola struct con la parola class, la compilazione risulterà impossibile.

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

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Classi e strutture (Guida per programmatori C#)

Strutture (Guida per programmatori C#)

Cronologia delle modifiche

Data

Cronologia

Motivo

Luglio 2008

Paragrafo aggiunto su CS0171

Correzione di errori nel contenuto.