Area di riferimento
- Developing applications that use system types and collections
- Manage data in a .NET Framework application by using the .NET Framework 2.0 system types
- Value types
User-Defined Value Types
Gli user-defined value types sono anche chiamati strutture (structs). Come gli altri value types, le istanze degli user-defined value types sono memorizzate sullo stack e contengono direttamente i loro dati. Le strutture non sono altro che un un aggregato di altri tipi e derivano tutte implicitamente da System.ValueType. Non è possibile derivare una struttura da un altra struttura anche se invece è possibile che implementino una o più interfacce.
Esempio di definizione di una struttura per la gestione di coordinate 3D:
public struct Punto3D
{
public Punto3D(int x, int y, int z)
{
this.x = x;
this.y = y;
this.z = z;
}
public void Trasla(int dx, int dy, int dz)
{
x += dx;
y += dy;
z += dz;
}
public int x;
public int y;
public int z;
}
Esempio di utilizzo della struttura appena definita:
class Program
{
static public void visualizzaPunto3D(Punto3D p)
{
Console.WriteLine("({0}, {1}, {2})", p.x, p.y, p.z);
p.x = 0;
}
static void Main(string[] args)
{
Punto3D p1 = new Punto3D(10, 20, 30);
Punto3D p2 = p1;
p1.Trasla(1, 2, 3);
visualizzaPunto3D(p1);
visualizzaPunto3D(p2);
Console.ReadKey();
}
}
il cui output a video è il seguente:
(11, 22, 33)
(10, 20, 30)
Questo codice mette in evidenza una cosa molto importante e cioè che l'assegnamento tra strutture (e quindi anche il passaggio di una struttura a un metodo) comporta una copia per valore. Dopo l'operazione di copia le due strutture sono contenute in spazi di memoria differenti dello stack. Nell'esempio infatti l'operazione Trasla agisce soltanto sulla struttura p1, inoltre lo statement p.x = 0 all'interno del metodo visualizzaPunto3D comporta la modifica del solo parametro formale e non dell'eventuale parametro attuale.
Le strutture dovrebbero essere utilizzate quando tutte le seguenti cose sono vere
- Il tipo si comporta come un tipo primitivo cioè non ha membri che permettano di modificare i suoi campi
- Il tipo non deve derivare da nessun altro tipo
- Il tipo non dovrà essere usato come base per altri tipi
inoltre siccome la copia per valore è costosa è opportuno utilizzare le strutture solo se le istanze del tipo sono piccole (meno di 16 bytes) oppure se sono grosse ma non sono mai passate come parametri o ritornate da un metodo.