Angella Andrea - Italian Blog

Infinita passione per lo sviluppo software !
posts - 133, comments - 216, trackbacks - 9

My Links

News

MIT OpenCourseWare: I'm invested Wikipedia Affiliate Button


Sto leggendo:

Archives

Post Categories

Siti web realizzati

Siti web tecnici

[70-536] - User-Defined Value Types


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.

Print | posted on sabato 25 agosto 2007 21:31 | Filed Under [ Exam 70-536 Application Development Foundation ]

Feedback

Gravatar

# re: [70-536] - User-Defined Value Types

Yep, ma lo stesso J.R. nello stesso libro CLR via C# sconsiglia vivamente di esporre metodi che modifichino lo stato interno di un value type.

La ragione è che potrebbero esserci comportamenti "anomali" a causa di boxing e unboxing.
Ho scritto un post su questo argomento qualche tempo fa... vediamo se lo trovo....

Eccolo! ;-)
http://blogs.ugidotnet.org/Crad/archive/2006/04/01/38128.aspx

Ciao Andrea
26/08/2007 00:02 | Marco De Sanctis
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET