Corso C# – Lezione n.2

Argomenti della lezione:

Le funzioni del CLS e del CTS
Nella piattaforma .Net sono presenti due moduli che si occupano di effettuare la traduzione da codice sorgente a linguaggio intermedio JIL (Just intermediate Language) il quale hanno dei compiti molto importanti.
Infatti il CLS “Common Language Specification” è un modulo che si occupa di gestire le differenze fra i vari tipi di codice sorgenti C#, C++, Viusal Basic, Javavascript e delle relative regole di traspozione e traduzione nel linguaggio IL appunto il linguaggio intermedio.
Un parte rilevante la svolge il CTS parte del CLS ovvero il Common Type Specification, che si opccupa di gestire e trasporre i vari tipi di dati presenti nei diversi codici sorgenti.
Per comprendere bene la questione partiamo da un esempio molto semplice ovvero la dichiarazione di un dato in precisione singola in C++ e C# è utilizzato il tipo float e in Visual Basic il tipo single che rappresentano alla fine lo stesso tipo di dato. Il CTS alla fine traduce questo tipi di dati sempre nella tessa entità IL ovvero un numero reale in precisione singola.
Fin qua tutto abbastanza semplice se non fosse per esempio che sono presenti alcuni tipi di dati che non sono supportati dal CLS come ad esempio il tipo uint ovvero intero senza segno, il tipo sbye che rappresenta un intero con segno a 8 bit, che in C++, Javascript non esiste.
E’ importante ricordare questi tipi non standard che saranno convertiti in tipi supportati dal CLS in un tipo di dati equivalente ma non identico a quello utilizzato nel codice sorgente.

I tipi valore e riferimento in C#

Nel C# esiste una prima distinzione nei tipi di dati utilizzabili per la scrittura di programmi: i tipi valore e i tipi riferimento.
Per tipo valore si intende una variabile che al suo interno contiene un valore del tipo selezionato in fase di dichiarazione.
Un tipo di riferimento è un tipo di dato che al suo interno contiene l’indirizzo di un’area di memoria che a sua volta contiene i dati veri e propri.
In particolare un esempio di tipo riferimento è il tipo Object che indica un generico oggetto che può contenere proprietà dell’oggetto e anche funzionalità di accesso a tali proprietà. Questo tipo è un tipo proprio utilizzato in modo universale all’intermo della programmazione ad oggetti, e sarà chiarito nelle prossime lezioni il suo uso e la sua enorme versatilità.
I tipi valore sono:
Numerici reali quali gli interi short, int, long
Numerici reali quali float e double in precisione singola e doppia
Stringa tipo string ovvero una sequenza di caratteri string word=”Hello”;
Carattere tipo char un singolo carattere ad esempio char lettera=’x’;
Logici tipo bool vero e falso ad esempio bool scontato=true;

Link Sponsorizzato

Le struct e le enum in C#

In C# inoltre è possibile dichiarare le struct e le enum rispettivamente le strutture composte da tipi di dati differenti detti “campi” con la sintassi:
struct nome struttura
{ tipo 1 identificatore 1;
tipo 2 identificatore 2;
…..
tipo N identificatore N;
}
Ad esempio
struct studente
{ string cognome;
string nome;
int age;
}
dichiara un record logico di nome studente, non è una variabile ma un modello di dati aò quale è possibile associare una variabile o un struttura dati come un tabella.
Ad esempio
struct studente alunno; dichiara un record logico di nome studente
struct studente[] alunno dichiara un array di record logici di lunghezza ancora non definita.
Le enumerazioni sono insiemi di dati statici non modificabili come un gruppo di costanti al quale è associata una cardinalità (posizione nell’insieme).
La dichiarazione di una enumerazione in C# avviene mediante la dichiarazione:
enum nome enumerazione
{ elemento1 =1;
elemento 2=2;
….
elemento N=N;
}
ad esempio
enum giorni
{ lun=1;
mar=2;
merc=3;
giov=4;
ven=5;
sab=6;
dom=7;
}
Ad esempio
giorni festivo1;
festivo1=6; // dichiara il sabato
Sono strutture statiche una volta dichiarata la struttura enumerativa nel codice non può sia i valori che la struttura non possono essere variate in esecuzione.

il cast dei dati

Il cast dei dati rappresenta un’operazione di conversione che tutti i linguaggi di programmazione moderni permettono.
Il cast può essere esplicito in C# ovvero con la sintassi:
variabile 2= (tipo dati)variabile 1
ove sia la variabile al primo membro che al secondo sono compatibili ad esempio è facile convertire un int in float o viceversa, un tipo string in float o double è possibile nei limiti della correttezza formale dei dati. Ricordo che il punto decimale è in notazione anglosassone “.”.
Ad esempio il seguente codice C#
int a=3;
float b=(float)a;
trasforma in float un numero intero aumentando la precisione, è possibile anche l’operazione inversa ma porta perdita dei dati per l’approssimazione all’intero più vicino di un numero decimale.
La classe Convert
Il C#`tuttavia dispone anche di una classe “Conver” che si occupa di convertire i dati in modo più articolato.
La classe “Convert” contiene alcuni metodi quali
toString(argomento) per convertire l’argomento ad esempio numerico o di altra natura in stringa, il metodo toInt32(stringa) per convertire la stringa in un intero a 32 bit, il meotodo toDouble(stringa) per convertire in precisione doppia, il metodo toSingle(stringa) per convertire in precisione singola.
In caso di errore sono sollevate delle eccezioni da gestire pena l’interruzione del programma per un errore di Run-time.

Progettazione di una prima classe in C#

Come prima classe progettiamo una classe che permetta di ricevere alcuni input da Console e di effettuare il cast dell’input che ricordo essere ricevuto in formato stringa. Inoltre nella classe è definito un costruttore che permette di inizializzare alcuni membri della classe privati (accessibili dalla classe stessa definiti attributi). Il costruttore è un metodo inizializzatore che viene invocato per primo nel momento in cui avviene l’istanziamento di un oggetto della classe.
Il codice C#:

1  using System;
2  namespace progetto_numeri
3  {
4     class Program
5   {
6         private int a;
7         private float b;
8         private double c;
9         private string d;
10        private bool e;
11        private char f;
12        public Program(string x, char y)
13        {
14            Console.WriteLine("Inserisci dei valori:");
15            Console.WriteLine("Numero intero:");
16            a = Convert.ToInt32(Console.ReadLine());
17            Console.WriteLine("Numero reale float");
18            b = Convert.ToSingle(Console.ReadLine());
19            Console.WriteLine("Numero reale in precisione doppia");
20            c = Double.Parse(Console.ReadLine());
21            d = x;
22            f = y;
23            e = true;
24        }
25        public void StampaEstremi()
26        {
27            /*Console.WriteLine("Valore di a,b,c,d,e,f:");
28            Console.WriteLine("a:" + a);
29            Console.WriteLine("b:" + b);
30            Console.WriteLine("c:" + c);
31            Console.WriteLine("d:" + d);
32            Console.WriteLine("e:" + e);
33            Console.WriteLine("f:" + f);*/
34            Console.WriteLine("Massimo intero e minimo:" + Int32.MaxValue + ", " + Int32.MaxValue);
35            Console.WriteLine("Massimo Reale Singolo e minimo:" + 36 Single.MaxValue + ", " + Single.MinValue);
37        }
38        static void Main(string[] args)
39        {
40            Program p = new Program("Hello World",'x');
41            p.StampaEstremi();
42            Console.WriteLine("Arrivederci !");
43        }
44    }
45 }

Il costruttore prende il nome della classe infatti e prevede due parametri che
saranno assegnati a due attributi della classe riga 21,22 in quanto i valori possono essere letti dall’interno della classe o dall’esterno ad esempio mediante passaggio di parametri stesso nel costruttore che provvede (non è questo il caso) a assegnare tali valori agli attributi privati della classe.
A riga 34 e 35 nel metodo StampaEstremi stampiamo i valori degli attributi e gli estremi inferiore e superiore di due tipi di dati interi a 32 bit e dati in precisione singola.

Video dell’argomento