5 pagine in totale: <<Indietro 1 2 3 4 [5]
Strutture
Oltre alle enumerazioni e alle classi, lo sviluppatore può definire in modo personalizzato anche i tipi di valore attraverso le strutture o struct.
Una struttura è un aggregato di dati simile ad una classe, dal momento che può contenere campi, metodi, proprietà ed eventi. La differenza rispetto ad una classe sta principalmente nel modo in cui una struttura viene persistita in memoria: essendo un tipo di valore, essa non viene inserita nel managed heap come avviene per le classi, ma viene allocata direttamente sullo stack.
Nota
Tutti i tipi primitivi di valore che sono stati trattati nei capitoli precedenti sono strutture. Per esempio, System.Int32 piuttosto che System.Boolean sono struct.
Quanto è stato detto finora per le classi rimane generalmente valido anche per la definizione di strutture. Peraltro le struct presentano alcune limitazioni rispetto alle classi. La tabella 4.2 riassume le principali differenze esistenti tra classi e strutture.
Tabella 4.2 - Differenze tra classi e strutture
| Classi | Strutture |
| Possono definire campi, proprietà, metodi ed eventi. | Possono definire campi, proprietà, metodi ed eventi. |
| Supportano tutti i tipi di costruttori e l'inizializzazione dei membri. | Non supportano i costruttori di default e l'inizializzazione dei membri. |
| Supportano il metodo Finalize, ovvero il distruttore. | Non supportano il metodo Finalize. |
| Supportano l'ereditarietà. | Non supportano l'ereditarietà. |
| Sono tipi di riferimento. | Sono tipi di valore. |
| Vengono allocati nel managed heap. | Vengono allocati sullo stack. |
Come si può notare in tabella, le strutture non possono derivare da altre strutture, né essere un tipo base per altri tipi. Inoltre le struct non supportano direttamente il costruttore di default, in quanto il compilatore lo genera sempre in modo automatico, inizializzando i membri al loro valore predefinito. È in ogni caso possibile dichiarare in modo personalizzato costruttori con parametri in overload a quello di default.
Per definire una struttura occorre specificare la parola chiave struct in C# e Structure in Visual Basic. La dichiarazione segue le stesse regole sintattiche che si sono viste per le classi nel corso del capitolo (esempio 4.19).
' Definizione di una struttura per i numeri complessi
Public Structure Complex
Public Real As Single ' Parte reale
Public Imaginary As Single ' Parte immaginaria
' Costruttore con parametri
Public Sub New(ByVal r As Single, ByVal i As Single)
Me.Real = r
Me.Imaginary = i
End Sub
' Metodo statico per la somma di due numeri complessi
Public Shared Function Sum(ByVal x As Complex, ByVal y As Complex) As Complex
Return New Complex(x.Real + y.Real, x.Imaginary + y.Imaginary)
End Function
End Structure
// Definizione di una struttura per i numeri complessi
Public struct Complex
{
public float Real; // Parte reale
public float Imaginary; // Parte immaginaria
// Costruttore con parametri
public Complex(float r, float i)
{
this.Real = r;
this.Imaginary = i;
}
// Metodo statico per la somma di due numeri complessi
public static Complex Sum(Complex x, Complex y)
{
return new Complex(x.Real + y.Real, x.Imaginary + y.Imaginary);
}
}
...omissis...
Conclusioni
La programmazione orientata agli oggetti è un paradigma di programmazione che si basa sulla definizione e sull'utilizzo di una serie di entità tra loro collegate, ciascuna delle quali è caratterizzata da un insieme di informazioni di stato e di comportamenti specifici. Queste entità sono denominate oggetti e ciascuna di esse può contenere contemporaneamente dati, funzioni e procedure.
Le classi, di cui gli oggetti sono istanze particolari, rappresentano gli elementi fondamentali per l'organizzazione e la strutturazione del codice nei linguaggi managed del .NET Framework. Esse sono i tipi di riferimento definiti dallo sviluppatore, contenenti campi, proprietà, metodi ed eventi.
Per le classi valgono i principi fondamentali della programmazione orientata agli oggetti, ovvero ereditarietà, polimorfismo e incapsulamento. Nei linguaggi del .NET Framework e, in particolare, in C# e Visual Basic una classe può derivare solamente da un'altra classe (ereditarietà singola), può ridefinire in modo personalizzato le implementazioni dei suoi membri, anche se ereditati dal tipo base, e può mascherare la sua struttura interna, utilizzando in modo appropriato gli access modifier.
Le interfacce sono tipi astratti privi di qualsiasi implementazione, dato che il loro scopo è semplicemente quello di definire un contratto valido per le classi che le implementano. Il grosso vantaggio nell'utilizzo delle interfacce è rappresentato dal fatto che ciascuna classe può implementare più interfacce contemporaneamente. Questo aspetto compensa la mancanza dell'ereditarietà multipla nei linguaggi managed del .NET Framework.
Le strutture rappresentano i tipi di valore definiti dallo sviluppatore. Esse sono un aggregato di dati simile ad una classe, dal momento che possono contenere campi, metodi, proprietà ed eventi. Le differenze tra strutture e classi sono minime: principalmente le strutture non supportano l'ereditarietà e, dato che sono tipi di valore, vengono allocate sullo stack invece che nell'ambito del managed heap.
5 pagine in totale: <<Indietro 1 2 3 4 [5]
Contenuti dell'articolo
- Pagina 1
- Pagina 3
- Pagina 4
- Pagina 5
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.





Difficoltà
Stampa
Download 



