Come lavorare con le strutture in C #

Sebbene ci siano molte somiglianze tra una classe e una struttura, ci sono anche alcune differenze distinte. Ancora più importante, una struttura a differenza di una classe è un tipo di valore. Quindi, mentre le istanze di una classe vengono archiviate nell'heap, le istanze di una struttura vengono archiviate nello stack.

Quando un'istanza di una struttura viene passata a un metodo, viene sempre passata per valore. Ciò è in contrasto con ciò che accade quando passiamo un'istanza di una classe a un metodo: l'istanza viene passata per riferimento.

Strutture di programmazione in C #

Ecco come appare la sintassi per dichiarare una struttura.

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;

    }

È ora possibile assegnare valori ai membri della struttura definita in precedenza, come mostrato nello snippet di codice di seguito.

Rectangle rectangle = new Rectangle();

rectangle.width = 10;

rectangle.height = 15;

Lo snippet di codice precedente crea un'istanza della struttura Rectangle e assegna valori ai membri pubblici di essa. Nota che puoi avere sia i dati dei membri che i metodi all'interno di una struttura. Inoltre, puoi specificare i membri come privati, pubblici e interni. Va notato che a differenza delle classi, non è possibile avere inizializzatori di campo per i campi non statici nelle strutture. Quindi, dichiarazioni come le seguenti in una struttura non sono valide.

int width = 10;

int height = 15;

Puoi comunque inizializzare i membri statici nelle tue strutture. Quindi la seguente è un'istruzione valida all'interno di una struttura.

static int area = 0;

Aggiungiamo ora alcuni metodi alla struttura. Ecco la versione aggiornata della struttura Rectangle che abbiamo creato in precedenza. Notare l'utilizzo del costruttore parametrizzato.

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;

        }

    }

Si noti che anche se una struttura non consente di definire un esplicito costruttore senza parametri al suo interno, è sempre possibile avere costruttori di parametri all'interno di una struttura. Inoltre, in modo simile a una classe, puoi avere anche costruttori sovraccarichi in una struttura. Ecco come puoi impostare i valori usando il costruttore della struttura Rectangle e quindi ottenere l'area invocando il metodo GetArea (). Va notato che in modo simile a una classe, puoi avere metodi statici e non statici all'interno di una struttura.

static void Main(string[] args)

        {

            Rectangle rectangle = new Rectangle(10, 15);

            int area = rectangle.GetArea();

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

            Console.Read();

        }

Come una classe, una struttura fornisce il supporto per proprietà e indicizzatori. Una delle principali differenze tra una struttura e una classe è che, a differenza di una classe, una struttura non supporta l'ereditarietà: non è possibile avere una struttura che estende un'altra classe o una struttura. Tuttavia, in modo simile a una classe, uno struct può implementare un'interfaccia. Ecco un esempio di codice che lo illustra.

 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;

        }

    }

Scegliere tra una classe e una struttura

Veniamo ora a un punto interessante del dibattito. Quando dovremmo usare una struttura su una classe e viceversa?

Come discusso in precedenza in questo articolo, un'istanza di una struttura viene creata nello stack mentre un'istanza di una classe viene creata nell'heap gestito. L'allocazione e la deallocazione dei tipi di valore sono più economiche dei tipi di riferimento. Una struttura è una buona scelta quando è necessario creare un tipo di dati composto che conterrebbe alcuni membri di dati. Idealmente, la dimensione dei membri dati di una struttura dovrebbe essere inferiore a 16 byte. È possibile optare per una struttura quando si desidera creare una piccola struttura dati composita che abbia una semantica del valore e contenga solo pochi membri di dati. Usando struct in questi casi, puoi evitare l'overhead associato alla garbage collection.

È necessario seguire le migliori pratiche consigliate quando si lavora con gli struct. Dovresti evitare di utilizzare una struttura di dimensioni maggiori rispetto a quanto consigliato in questo articolo. Inoltre, si noti che il passaggio di istanze di strutture ai metodi è più costoso in termini di prestazioni rispetto al passaggio di istanze di classi. Si consiglia di utilizzare gli struct quando si lavora con strutture di dati di piccole dimensioni. Per ulteriori informazioni su questo argomento, consultare questo articolo di MSDN.