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
Breve introduzione al .NET Framework
Il Microsoft .NET Framework 2.0 è costituito da due parti: il Common Language Runtime (CLR) e la Framework Class Library (FCL). Il CLR costituisce l'ambiente di esecuzione per le nostre applicazioni ed è l'equivalente della Java Virtual Machine del mondo Java. La FCL fornisce delle API orientate agli oggetti per svolgere diverse operazioni necessarie alle applicazioni. Il Microsoft .NET Framework offre un'ambiente gestito per l'esecuzione del codice e permette di sviluppare applicazioni con differenti linguaggi in grado di interoperare. Siccome i tipi di dati sono il modo attraverso cui il codice scritto in un linguaggio di programmazione può "parlare" con codice scritto in un altro linguaggio, Microsoft ha creato una specifica formale: il Common Type System (CTS) che descrive come i tipi sono definiti e come essi si comportano. Inoltre Microsoft ha definito un Common Language Specification (CLS) che fornisce i dettagli necessari affinchè possano essere sviluppati compilatori che generano codice compatibile con altri linguaggi. Il codice generato dai compilatori è chiamato Microsoft Intermediate Language (MSIL) ed è l'unico linguaggio che il CLR è in grado di eseguire. L'integrazione dei linguaggi, uno dei più grandi obiettivi che Microsoft si era imposta, è diventata realtà !
Tutto il codice che inserirò nei miei post sarà scritto utilizzando il linguaggio C#.NET tuttavia coloro che preferiscono VB.NET possono utilizzare diversi convertitori di codice da C# a VB. Un semplice convertitore basato sul web può essere raggiunto al seguente indirizzo: http://authors.aspalliance.com/aldotnet/examples/translate.aspx.
Value Types
I value types sono variabili che contengono i loro dati direttamente. Le istanze di value types sono memorizzati in un'area di memoria chiamata Stack, dove il runtime può creare, leggere, aggiornare e rimuovere i dati molto velocemente e con il minimo overhead. L'assegnamento tra due variabili value type comporta la copia dei dati da una variabile all'altra ma questi dati sono memorizzati in due differenti lacazioni di memoria sullo stack. Tutti i tipi del framework (compresi i value types) derivano dal tipo System.Object.
Esistono tre tipi di value types:
- Built-in types
- User-Defined types
- Enumerations
Built-in Types
I built-in types sono tipi forniti con il .NET Framework e costituisco i mattoni con i quali altri tipi vengono realizzati.
I più comuni value types presenti nel namespace System sono mostrati nella seguente tabella, in cui riporto anche le corrispondenti parole chiave C#
Value types | Keyword in C# | Descrizione |
System.Boolean | bool | Valore booleano (true o false) |
System.Byte | byte | Valore intero (da 0 a 255) |
System.SByte | sbyte | Valore intero (da -128 a 127) |
System.Char | char | Singolo carattere unicode (occupa 2 bytes) |
System.Int16 | short | Valore intero con segno a 16 bit |
System.Int32 | int | Valore intero con segno a 32 bit |
System.Int64 | long | Valore intero con segno a 64 bit |
System.UInt16 | ushort | Valore intero senza segno a 16 bit |
System.UInt32 | uint | Valore intero senza segno a 32 bit |
System.UInt64 | ulong | Valore intero senza segno a 64 bit |
System.Single | float | Numero in virgola mobile a precisione singola |
System.Double | double | Numero in virgola mobile a precisione doppia |
System.Decimal | decimal | Numero decimale |
System.DateTime | - | Data e ora del giorno |
System.TimeSpan | - | Intervallo di tempo |
E' importante sottolineare che esporre funzionalità pubbliche mediante l'utilizzo dei tipi numerici senza segno non permette l'interoperabilità completa con gli altri linguaggi in quanto questi built-in types non sono definiti nel CLS.
Codice di Esempio
Un esempio di dichiarazione e d'uso dei built-in types:
int x = 3;
int y = 4;
bool b = true;
float f = (x + y) / 2.0F;
double d = Math.Pow(x, y);
decimal dec = 12345566776.451341541251255151M;
Console.WriteLine("x + y = {0}", x + y);
Console.WriteLine("b = {0}", b);
Console.WriteLine("Media tra x e y = {0}", f);
Console.WriteLine("x ^ y = {0}", d);
Console.WriteLine("d = {0}", dec);
Giorni dei mesi di uno specifico anno:
int anno = 2007; // anno di interesse
int giorni;
for (int mese = 1; mese <= 12; mese++)
{
giorni = DateTime.DaysInMonth(anno, mese);
Console.WriteLine("Il mese {0} dell'anno {1} ha {2} giorni", mese, anno, giorni);
}
Differenza tra due DateTime:
DateTime dt1 = new DateTime(2007, 8, 25, 4, 14, 0);
DateTime dt2 = new DateTime(2007, 8, 25, 9, 0, 0);
Console.WriteLine("dt1 = {0}", dt1.ToString() );
Console.WriteLine("dt2 = {0}", dt2.ToString() );
if (dt2 > dt1)
{
TimeSpan diff = dt2 - dt1;
Console.WriteLine("dt2 - dt1 = {0}", diff.ToString() );
}