Lezione 1 - Introduzione a .Net e C#

2,609 views

Published on

Prima lezione del corso di introduzione a C# ed all'ENAIP di Udine

Un ringraziamento particolare a Stefano Mizzaro e Paolo Coppola

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,609
On SlideShare
0
From Embeds
0
Number of Embeds
298
Actions
Shares
0
Downloads
0
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Lezione 1 - Introduzione a .Net e C#

  1. 1. + Lezione 1 – Introduzione a .NET Dr. Paolo Casoto, Ph.D - 2012
  2. 2. + Credits I lucidi di questa lezione sono stati redatti dal Dr. Paolo Casoto nel 2012. Sono rilasciati con licenza Creative Commons Attribuzione, non commerciale e non opere derivate. Dr. Paolo Casoto, Ph.D - 2012
  3. 3. + Introduzione a .NET  Prima dell’arrivo della piattaforma .NET il mondo della programmazione Windows disponeva di una pletora di soluzione  C e Windows API: gestione della memoria, puntatori, sintassi complessa e mancanza degli oggetti  C++ e MFC: astrazione object oriented alle classi base Windows API.  Seppur estremamente potente è caratterizzato dalle medesime criticità di C  Visual Basic 6: più semplice ma non del tutto object oriented  E.g.: manca l’ereditarietà fra le classi  Java: difficoltà di interfacciamento con sistemi e soluzioni legacy esistenti Dr. Paolo Casoto, Ph.D - 2012
  4. 4. + Introduzione a .NET  Per non citare soluzioni ancora più complesse, come la soluzione COM  Framework indipendente dal linguaggio per lo sviluppo di componenti binari riutilizzabili  Indipendenza dal linguaggio  Componenti interagenti anche se scritti in linguaggi differenti  Supporto di RPC ed astrazione rispetto alla locazione dei singoli componenti COM  Difficoltà di installazione e deployment delle componenti realizzate  E.g.: gestione registri, firma del compilato, et al. Dr. Paolo Casoto, Ph.D - 2012
  5. 5. + Introduzione a .NET  Da qui la necessità di definire una piattaforma innovativa in grado di: 1. Garantire l’interoperabilità con il codice COM e legacy esistente 2. Garantire il supporto a molteplici linguaggi di programmazione 3. Definire un ambiente di esecuzione (runtime engine) comune a tutti i linguaggi .NET  Il codice scritto nei diversi linguaggi è compilato in un linguaggi intermedio (IL) comune, il linguaggio dell’esecutore  Macchina virtuale, in stile Java 4. Disporre di un insieme ampio di tecnologie e classi predefinite per l’esecuzione di tutte le attività più frequenti n Web Service, accesso al file system, GUI, threading, et al. n Deployment semplificato Dr. Paolo Casoto, Ph.D - 2012
  6. 6. + Un po’ di sigle: CLR, CTS e CLS  .NET può essere visto come un insieme composto da un ambiente di esecuzione ed un insieme di librerie base  L’ambiente di esecuzione prende il nome di Common Language Runtime (CLR):  Esegue il codice compilato, gestisce la sicurezza, la memoria, i thread di esecuzione, et al.  All’interno del codice in esecuzione nel CLR possono essere utilizzati tutti e soli i tipi di dato definiti nel Common Type System (CTS)  Specifica i tipi di dato e come siano rappresentati all’interno del CLR.  Il codice in esecuzione all’interno del CLR deve rispettare i costrutti definiti dal Common Language Specification (CLS) Dr. Paolo Casoto, Ph.D - 2012
  7. 7. + Un po’ di sigle: CLR, CTS e CLS  Grazie alla definizione esplicita di CTS e CLS è possibile per ciascuno sviluppare un proprio linguaggio e renderlo .NET based  Devo utilizzare tipi e costrutti condivisi con gli altri linguaggi della piattaforma  Introduzione di linguaggi .NET based alternativi a quelli offerti da Microsoft  Delphi .NET  Le classi base in .NET coprono tutte le possibili aree funzionali di maggior utilizzo, dall’accesso ai DB allo sviluppo di interfacce grafiche per l’interazione con l’utente. Dr. Paolo Casoto, Ph.D - 2012
  8. 8. + Il Common Language Runtime  Per poter essere eseguito all’interno del CLR un codice deve essere compilato in due passi: n Compilazione dal codice sorgente al codice nel linguaggio intermedio  Compilatore. n Compilazione dal codice nel linguaggio intermedio al codice macchina del processore  CLR  Indipendenza dalla piattaforma hardware  Non mi interesso dalla macchina reale dell’utente; sarà il suo specifico CLR a compilare nelle istruzioni specifiche il mio codice intermedio  No a livello software, dove parliamo solo di piattaforma Windows  Aumento delle performance, grazie alla compilazione Just in Time Dr. Paolo Casoto, Ph.D - 2012
  9. 9. + Il Common Language Runtime  Integrazione fra linguaggi: poiché tutti i linguaggi compilano codice intermedio, la loro interazione a livello di programmi compilati è possibile.  Codice con la medesima semantica scritto in C# e Visual Basic produce il medesimo codice intermedio…PROVIAMO INSIEME ?  Scriviamo un ciclo che stampa i primi 10 numeri (da 1 a 10) in C# ed in Visual Basic  Compiliamo i due codici  Disassembliamo i due compilati in codice intermedio, mediante lo strumento disassemblatore  Lo trovate fra gli strumenti di Visual Studio Dr. Paolo Casoto, Ph.D - 2012
  10. 10. + Il Common Language RuntimeCodice CompilatoreSorgente C#Codice Compilatore Codice ILSorgente VB CommonCodice Compilatore LanguageSorgente Visual C++ Runtime JIT Codice Macchina Dr. Paolo Casoto, Ph.D - 2012
  11. 11. + Il Common Language Runtime  Garbage collector: gestione automatica della deallocazione degli oggetti e dei valori inutilizzati dalla memoria  Il programmatore .NET non deve preoccuparsi in alcun modo del problema delle deallocazione dei dati  Con alcune eccezioni nel caso di Visual C++ che interagisce con codice COM (ma non lo vedremo )  La memoria, come in Java, è del tutto trasparente per il programmatore.  Gestione della sicurezza: il CLR gestisce la possibilità di eseguire o meno un pezzo di codice potenzialmente critico  E.g.: blocco delle chiamate al filesystem per il codice scaricato da Internet  Complementa la sicurezza a livello di ruolo che caratterizza le piattaforme Windows, con maggiore granularità Dr. Paolo Casoto, Ph.D - 2012
  12. 12. + Un ambiente orientato agli oggetti - CTS  Tutti i linguaggi basati su .NET sono caratterizzati da:  Concetto di classe  Insieme di metodi ed attributi  I tipi classe possono essere posti in relazione l’uno con gli altri  E.g.: ereditarietà  Concetto di interfaccia  Insieme di metodi (astratti) che possono essere implementati da una classe  Concetto di struttura: già presente in C e Delphi  Concetto di numerazione  Concetto di delegato  Concetto di membro di una classe o di una interfaccia Dr. Paolo Casoto, Ph.D - 2012
  13. 13. + Un ambiente orientato agli oggetti - CTS Tratto da “Professional C# Dr. Paolo Casoto, Ph.D - 2012 4 e .NET 4” Ed.Wrox, pag.
  14. 14. + Tipi valore e tipi riferimento  Il linguaggio intermedio mette a disposizione 2 tipologie di tipi di dato:  Tipi valore (value type): tipi per i quali una variabile mantiene al suo interno il rispettivo valore  Memorizzati all’interno di una locazione di memoria definita stack  Tipi riferimento (reference type): tipi per i quali una variabile mantiene al suo interno un indirizzo alla locazione dove sono disponibili i valori  Memorizzati all’interno di una locazione di memoria definita managed heap Dr. Paolo Casoto, Ph.D - 2012
  15. 15. + I tipi base del linguaggio  Il CTS definisce inoltre un insieme di tipi base, che in C# sono caratterizzati dalle seguenti parole chiave.  byte e sbyte (signed byte)  short, int e long: numeri interi con dimensione 16, 32 e 64 bit con segno  ushort, uint, ulong: numeri interi con dimensione 16, 32 e 64 bit senza segno  float, double: numeri in virgola mobile  object: puntatore ad una locazione di memoria all’interno della managed heap. Utilizzato per gestire i reference type.  char  string  bool: valore booleano true / false Dr. Paolo Casoto, Ph.D - 2012
  16. 16. + Assembly in .NET  Un assembly è una unità logica che contiene il codice compilato .NET  Indipendentemente dal linguaggio  Composto da uno o più file, utilizzati per la memorizzazione sia del codice di libreria, sia del codice eseguibile.  Ciascun assembly è caratterizzato da un manifest che ne descrive proprietà (e.g.: versione, nome, autore) e tipi in esso contenuti.  Gli assembly possono essere utilizzati in due modalità:  Privato: caratterizza l’utilizzo standard nelle applicazioni desktop. Un assembly è utilizzato da una sola applicazione  Condiviso: tutte le applicazione possono far uso dell’assembly, collocato in una speciale directory del filesytem, la Global Assembly Cache Dr. Paolo Casoto, Ph.D - 2012
  17. 17. + Organizzare il codice .NET: namespace  Un namespace è un raggruppamento di tipi all’interno di un assembly, caratterizzati da una semantica condivisa  E.g.: insieme delle classi per l’accesso al database  Corrispettivo del costrutto package nel mondo Java, con l’unica differenza della indipendenza dalla locazione fisica del file che contiene il tipo.  Anche le librerie base sono costituite da un insieme di assembly, caratterizzati ciascuno da un insieme di namespace e di tipi  Al fine di utilizzare i tipi presenti all’interno di una dll .NET nel nostro progetto, è necessario aggiungere i riferimenti alla dll selezionata  Vediamo come in Visual Studio fra poco. Dr. Paolo Casoto, Ph.D - 2012
  18. 18. + Il linguaggio C#  Finora abbiamo parlato a livello generale delle caratteristiche della piattaforma .NET  Caratteristiche comuni a tutti i linguaggi della piattaforma.  Analizziamo ora il linguaggio principale della piattaforma, il linguaggio C#  Linguaggio moderno, che integra al suo interno tutte le caratteristiche dei moderni linguaggio object oriented, molti elementi che derivano dalla programmazione dichiarativa e da quella funzionale.  Gestione degli attributi  Assenza dei puntatori  E decine di altre funzionalità che vedremo nel corso di queste lezioni Dr. Paolo Casoto, Ph.D - 2012
  19. 19. + Il nostro primo programma C# Definizione della classe Commento Definizione del metodo Scrivo sulla Leggo dalla console console Da notare: • L’utilizzo del punto e virgola al termine delle righe che interagiscono con la console • L’utilizzo delle graffe per apertura e chiusura di un blocco di codice Dr. Paolo Casoto, Ph.D - 2012
  20. 20. + Un programma più complesso Definizione della classe Definizione del metodo Dr. Paolo Casoto, Ph.D - 2012
  21. 21. + Analizziamo il secondo programma  Anche il secondo programma riporta le due righe necessarie alla definizione della classe e del metodo Main  Scopriremo subito l’importanza di questo metodo.  Il programma è caratterizzato dalla presenza di due parte, una spiccatamente dichiarativa, la prima, ed una invece “eseguibile”  Nella prima parte del programma definiamo in insieme di variabile, i cui valori saranno utilizzati dalla parte “eseguibile”  Da notare anche in questo caso l’utilizzo del ; per la conclusione di ciascuna istruzione  Come in Java  Notate inoltre il simbolo = utilizzato per l’assegnamento delle variabili  Per l’uguaglianza utilizzeremo == Dr. Paolo Casoto, Ph.D - 2012
  22. 22. + L’importanza della leggibilità di un programma Una scarsa leggibilità compromette la comprensione del programma e facilita gli errori Scoprirete nel corso del corso che all’interno di questo esempio c’è un secondo errore legato all’utilizzo di una parola riservata… Dr. Paolo Casoto, Ph.D - 2012
  23. 23. + Analizziamo nuovamente il secondo programma Area di importazione e definizione dei namespace Dr. Paolo Casoto, Ph.D - 2012
  24. 24. + Analizziamo nuovamente il secondo programma  C# è, come Java, case-sensitive  Pippo != PIPPO != pIPPO  La parte superiore del programma definisce, mediante la parola chiave using, i namespace che saranno utilizzati dal vostro programma  Visual Studio esegue per voi automaticamente l’importazione di un insieme standard di namespace dipendente dalla tipologia di progetto che state sviluppando  E.g.: libreria, applicazione grafica, applicazione per console Dr. Paolo Casoto, Ph.D - 2012
  25. 25. + La parola chiave namespace  La parola chiave namespace consente di indicare che tutto il codice racchiuso fra la coppia di parentesi più esterne fa parte del namespace  Tutti i tipi ivi definiti sono associati al namespace  Un tipo può appartenere al più ad un solo namespace  Ricordatevi di chiudere sempre la parente graffa del namespace al termine della definizione della vostra classe  Una buona regola è quella che l’ultimo metodo sia chiuso da 3 parentesi graffe:  Una per il metodo  Una per la classe  Una per il namespace Dr. Paolo Casoto, Ph.D - 2012
  26. 26. + Ma quali namespace stiamo utilizzando ?  La classe Console, i cui metodi consentono lettura e scrittura dei dati, è definita all’interno del namespace System  Il namespace System ed i suoi namespace di secondo livello sono fra i più utilizzati in .NET poiché sono i namespace dove è collocata la maggior parte delle classi della libreria di riferimento di .NET  Se rimuovessimo la riga di importazione del namespace System mediante la parola chiave using, non potremmo compilare la nostra classe  Il sistema non saprebbe dove reperire la classe Console.  A differenza dei package Java, classi collocate all’interno di directory differenti del progetto possono condividere lo stesso namespace  Contenitore logico e non fisico  Ricordatevi inoltre che il rapporto fra namespace ed assembly è molti a molti  CASO 1: Più assembly definiscono lo stesso namespace (vedremo in che modo)  CASO 2: Più namespace sono definiti dallo stesso assembly Dr. Paolo Casoto, Ph.D - 2012
  27. 27. + Non tutte le ciambelle riescono col buco  Finora i nostri programmi hanno sempre risposto adeguatamente ma non è sempre così  Si fano sempre erori quado si scrife un programa!  Bisogna imparare a gestire gli errori: 1. Capire i messaggi di errore del compilatore 2. Capire i messaggi di errore al tempo di esecuzione 3. Capire perché il programma non fa quello che vogliamo  Visual Studio ci viene in aiuto per quanto concerne il primo tipo di errori indicandoci in maniera chiara l’origine dell’errore e la motivazione Dr. Paolo Casoto, Ph.D - 2012
  28. 28. + Un programma ancora più complesso Leggo dalla console i due numeri interi Eseguo una alternativa: IF + espressione logica Il ReadLine finale evita la scomparsa della console…chi viene da Pascal se ne ricorderà sicuramente  Dr. Paolo Casoto, Ph.D - 2012
  29. 29. + Ancora esempi: stampiamo i primi 10 numeri Questo programma è ORRIBILE … e se dovessimo stampare 100 numeri ??? Ripensiamo al tutto utilizzando i cicli Dr. Paolo Casoto, Ph.D - 2012
  30. 30. + Stampiamo i primi 10 numeri in modo intelligente Con la modifica di un solo valore della guardia potrei, ad esempio, stampare i valori fino a 10000 Dr. Paolo Casoto, Ph.D - 2012
  31. 31. + Parole riservate Utilizzate dal linguaggio per la definizione della propria sintassi abstract as base bool break byte case catch char checked class const continue default do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is long lock namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof void uint ulong unchecked ushort using virtual void volatile while Dr. Paolo Casoto, Ph.D - 2012
  32. 32. + Quali abbiamo già conosciuto ? abstract as base bool break byte case catch char checked class const continue default do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is long lock namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked ushort using virtual void volatile while Dr. Paolo Casoto, Ph.D - 2012
  33. 33. + Identificatori  Nomi assegnati alle diverse componenti del nostro programma  Variabili, classi, metodi, namespace, et al.  Regole per la formazione degli identificatori  No parole riservate  Il carattere iniziale deve essere uno fra:  A – Z, a – z, _  E i caratteri seguenti devono essere fra:  Idem, in più: 0 - 9  Quindi:  Lunghezza illimitata  Niente spazi  Maiuscole diverse dalle minuscole (area e Area)  Caratteri vietati: ",;.:!@#%^&()-=+/*{}[] … Dr. Paolo Casoto, Ph.D - 2012
  34. 34. + Identificatori Corretto Errato area 32area _area Area selezionata Area32 Area$$ Elemento_selezionato Elemento% elemento_selezionato class Parola riservata Dr. Paolo Casoto, Ph.D - 2012
  35. 35. + Variabili  “Scatola” che contiene al suo interno un valore (tipi valore) o un riferimento (tipi riferimento).  Ciascuna variabile è caratterizzata da un tipo e da un identificatore, che ne consente l’accesso.  Una variabile può contenere esclusivamente valori del tipo che la caratterizza  Non posso inserire un dato in virgola mobile all’interno di una variabile intera  Il compilatore lo impedirebbe, poiché stiamo lavorando in un linguaggio fortemente tipato, che valida in fase di compilazione il rispetto dei tipi (type checking) di ciascuna variabile  Il tipo di una variabile è assegnato nella fase di dichiarazione Dr. Paolo Casoto, Ph.D - 2012
  36. 36. + Variabili  Dichiarazione  int pippo  “dichiaro che la variabile pippo è di tipo intero”  Tuttavia non è possibile utilizzare una variabile dichiarata a meno di non assegnarvi un valore  L’assegnamento di un valore (sia esso di un value type o un reference type) ad una variabile avviene mediante l’utilizzo dell’operatore =  pippo = 10;  Dichiarazione ed assegnamento possono essere realizzati anche nella stessa istruzione  int pippo = 20; Dr. Paolo Casoto, Ph.D - 2012
  37. 37. + Variabili  E’ possibile dichiarare anche più variabili dello stesso tipo all’interno di una unica istruzione  int pippo = 10, pluto = 20;  Per dichiarare variabili di tipi diversi devo utilizzare istruzioni diverse.  Alcuni consigli: n Non definire identificativi di variabili che inizino per _ n Non definire variabili con lo stesso nome scritte maiuscole o minuscole n Prima lettera minuscola n Eventuali nomi successivi con lettera maiuscola (camel case)  E.g.: elementoSelezionato, elementoDestroLavatrice Dr. Paolo Casoto, Ph.D - 2012
  38. 38. + Il processo di inizializzazione di una variabile  Il compilatore di C# verifica che le variabile siano sempre inizializzate prima del loro utilizzo  Non è pensabile che l’utente possa imbattersi in valori “spazzatura” già presenti nelle locazioni di memoria associate alle variabili  Variabili di classe o di struttura: inizializzazione in fase di creazione  Vedremo che cosa sono questa tipologia di variabili  Variabili utilizzate all’interno di un metodo: inizializzazione obbligatoria (mediante assegnamento) prima dell’utilizzo della variabile.  La creazione di variabili di tipo reference richiede l’utilizzo della parola riservata new Dr. Paolo Casoto, Ph.D - 2012
  39. 39. + Identificare automaticamente il tipo di una variabile  In C# è possibile utilizzare il tipo generico var per delegare al compilatore l’identificazione del tipo corretto per una data variabile.  Per poter inferire il tipo di una variabile, è necessario che l’istruzione di dichiarazione coincida con quella di assegnamento  Cerco di capire il tipo di una variabile sulla base del tipo dell’espressione utilizzata per la sua valutazione  Si utilizza in particolari funzionalità del linguaggio, ad esempio LINQ, dove l’utente può non conoscere fino a runtime il tipo dell’output di una espressione. Dr. Paolo Casoto, Ph.D - 2012
  40. 40. + Identificare automaticamente il tipo di una variabile  Il tipo di una variabile identificata automaticamente non può essere modificato.  La variabile non può assumere valore vuoto  Se ho un valore vuoto non posso inferire alcun tipo da esso.  var i = 10; i come numero intero  var i = “Pippo”; i come stringa Dr. Paolo Casoto, Ph.D - 2012
  41. 41. + Stack e Managed Heap: dove sono i nostri valori ?  Tutti le istanze di tipi valore sono memorizzate all’interno di un’area della memoria definita Stack  Area di dimensione ridotta ad accesso relativamente veloce  Tutte le istanze di tipi complessi, quali array o oggetti, sono memorizzati all’interno di una struttura dati più complessa, chiamata managed heap.  La heap managed richiede una maggior complessità al fine di ottimizzare il lavoro del garbage collector  Molte delle scelte relative all’implementazione della managed heap sono legate proprio a tale ottimizzazione, come la scelta di operare su più generazioni  Assunzione basata sull’osservazione che pochi oggetti persistono a lungo, mentre la maggior parte degli oggetti presenta un ciclo di vita molto breve Dr. Paolo Casoto, Ph.D - 2012
  42. 42. + Tipi primitivi keyword bit valori sbyte 8 -128:127 short 16 -32768:32767 int 32 (-2^31:2^31–1) long 64 (-2^63:2^63–1) byte 8 0:255 ushort 16 0:65535 uint 32 (0:2^32–1) ulong 64 (0:2^64–1) float 32 double 64 decimal 128 Dr. Paolo Casoto, Ph.D - 2012
  43. 43. + Tipi primitivi  I numeri interi per default sono int  Se voglio uint, long o ulong devo indicarlo espressamente utilizzando una serie di prefissi al valore in fase di assegnamento  long pippo = 123L  uint pippo = 123U  ulong pippo = 123UL  I numeri con virgola mobile per default sono double  Se voglio float devo indicarlo espressamente utilizzando il prefisso F Dr. Paolo Casoto, Ph.D - 2012
  44. 44. + I tipi decimal  Tipo definito nel CTS per la gestione delle valutazioni in virgola mobile ove è necessario lavorare con precisione decimale  E.g.: gestione di valori decimali nell’ambito di calcoli monetari o di grandezze scientifiche  Ove non è accettabile la perdita di precisione che i double o i float possono generare in fase di rappresentazione dei valori  Attenzione: non è un tipo primitivo, deve essere utilizzato con parsimonia per non incidere sulle performance  Utilizziamo il prefisso M per definire un valore come decimal  decimal pippo = 123,345M Dr. Paolo Casoto, Ph.D - 2012
  45. 45. + Tipi primitivi / 2 keyword bit valori bool true - false char 16 Singolo carattere a 16 bit string Sequenza di caratteri UNICODE object Riferimento ad un oggetto contenuto nella managed heap Dr. Paolo Casoto, Ph.D - 2012
  46. 46. + Tipo char  I tipi char sono rappresentati fra apici. Le stringhe fra virgolette  E.g.: ‘a’ è un char, “a” è una stringa  Possono essere definiti anche mediante un intero o la codifica esadecimale del rispettivo codice UNICODE  char pippo = ‘u4001’; Ho utilizzato tutte e 3 le possibili definizioni del tipo char Dr. Paolo Casoto, Ph.D - 2012
  47. 47. + Sequenze di escape  Insieme di simboli utilizzati per la definizione di particolari caratteri (se utilizzati fra apici) o elementi di stringhe (se utilizzati fra virgolette)  u: carattere Unicode  : apice singolo  ": apice doppio  : barra inversa  t: tabulazione  n: nuova linea  r: ritorno di carrello  v: tabulazione verticale
  48. 48. + Il tipo object  In C# tutti gli oggetti ereditano da object  Corrispettivo di Object in Java, NSObject in Objective-C, et al.  Tutti gli oggetti possono ereditare da object i propri metodi ed eventualmente sovrascriverli  Vedremo il caso del metodo ToString  Anche le stringhe sono a tutti gli effetti oggetti, posizionati all’interno della managed heap  Le stringhe tuttavia sono immutabili !!!  Ciascuna operazione di modifica eseguita su una stringa comporta la creazione di una nuova stringa all’interno della managed heap Dr. Paolo Casoto, Ph.D - 2012
  49. 49. + Letterali  Sono i veri e propri valori che il programmatore assegna all’interno delle variabili nel proprio programma  E.g.: 1, 5.6, ‘a’, “pippo”, false  Sono valori di un tipo Letterali numerici  12 è un int  12L è un long  12.34 è un double, 12.34F (o f) è un float  true e false sono bool Letterali logici  z è un char  “pippo” è una stringa Letterali di tipo stringa Dr. Paolo Casoto, Ph.D - 2012
  50. 50. + Costanti  Variabile che non può variare il suo valore per l’intero ciclo di vita.  Definiamo una costante mediante la parola riservata const in fase di dichiarazione – inizializzazione  Infatti non è possibile dichiarare una costante se non in concomitanza con la sua inizializzazione.  I valori delle variabili devono essere letterali definiti a livello di compilazione  Non è possibile definire il contenuto di una costante mediante una variabile  Utilizzate sempre le costanti per rappresentare tutti quei valori magici che conservano la logica dei vostri applicativi all’interno del codice  E.g.: per modificare un valore devo modificare solo la definizione della costante e non effettuare una sostituzione ad ogni occorrenza del valore Dr. Paolo Casoto, Ph.D - 2012
  51. 51. + Conversioni fra valori numerici  Interi  Tutte le conversioni da un tipo più “piccolo” ad un tipo più “grande” sono consentite in modo implicito  E.g.: int pippo = 2; long pluto = pippo  Tutte le conversioni in direzione inversa devono essere esplicitate  E.g.: short pippo = (short) 10;  Rivedremo nel caso degli oggetti concetti simili parlando di casting  Floating point  Conversione implicita da float a double, esplicita da double a float  Conversione implicita da interi a virgola mobile, esplicita al contrario  Tutti i tipi numerici possono essere convertiti in modo implicito in un decimal Dr. Paolo Casoto, Ph.D - 2012
  52. 52. + Operatori aritmetici  +, - , * , /, %: gestione delle basilari operazioni aritmetiche  C# non genera alcuna eccezione in caso di overflow, ma assume comportamenti “risolutivi” che possono generare risultati non attesi.  E’ possibile forzare la gestione dell’overflow mediante la parola riservata checked.  Incrementi e decrementi (++ e --)  Possono essere utilizzati prima o dopo una variabile numerica per indicare che il suo valore deve essere incrementato o decrementato prima o dopo l’esecuzione dell’istruzione corrente  Console.WriteLine (i++); // Prima stampo il valore di I, poi lo incremento  Console.WriteLine (++i); // Prima incremento il valore di I, poi lo stampo  I numeri ad 8 e 16 bit non sono caratterizzati dal supporto alle operazioni aritmetiche  Conversione automatica ad un tipo a 32 bit ove eseguire le operazioni  Necessità di una conversione esplicita per i risultati Dr. Paolo Casoto, Ph.D - 2012
  53. 53. + Operatori sui bit  ~ Not  & And  | Or  >> Shift a destra  << Shift a sinistra  ^ Complementare  Attenzione a non confondere operatori sui bit con operatori logici !!! Dr. Paolo Casoto, Ph.D - 2012
  54. 54. + Operatori logici  == Uguaglianza (!= diversità)  Attenzione: vale per i value type. Nel caso dei reference type questa espressione verifica solo se le due variabili puntano alla stessa locazione di memoria.  Non verifica se due oggetti in memoria hanno i medesimi valori  >, <, >=, <=  ! (NOT), && (AND), || (OR): consentono di costruire espressioni logiche complesse  Valutazione “short circuit”: nel caso di un costrutto AND, la valutazione si ferma al primo valore negativo, viceversa per l’OR  E.g.: if(pippo!=null && pippo.value==1) Dr. Paolo Casoto, Ph.D - 2012
  55. 55. + Operatori logici  E’ buona norma, soprattutto nel caso di variabili che possono puntare ad oggetti non inizializzati, verificare sempre per prima la diversità della referenza dal valore null  Si rischia di generare, in caso contrario, una eccezione !!!  & (And) e | (Or) : senza valutazione del short circuit.  Tutte le componenti della espressione sono valutate  Attenzione, può essere pericoloso !!!  Quando utilizzare questa tipologia di operatori ? Quando è utile portare comunque a termine la valutazione di una espressione  ? a : b: forma compressa del costrutto if  E’ di ridotta leggibilità e per questo da utilizzarsi solo se strettamente necessario  Cioè mai !!! Dr. Paolo Casoto, Ph.D - 2012
  56. 56. + Espressioni  Le espressioni sono utilizzate per denotare un valore  La forma più semplice di una espressione sono costanti e variabili  Le espressioni possono essere realizzate combinando fra loro espressioni ed operatori  Operatori che in c# possono essere unari, binari o ternari, in relazione al numero dei loro argomenti  base * altezza / 2  (baseMinore + baseMaggiore) * altezza / 2  2 * PI_GRECO * raggio  contatore + 1  ultimo != z Dr. Paolo Casoto, Ph.D - 2012
  57. 57. + Precedenza  All’interno di una espressione l’ordine di valutazione è determinato dalla precedenza degli operatori  Più è alta la precedenza di un operatore, prima esso sarà eseguito e sostituito nel corpo della espressione  Quasi tutti gli operatori binari hanno una precedenza di esecuzione da sinistra a destra  8/4/2 = 1  Gli operatori di assegnamento (e.g. = ) sono valutati, invece, da destra a sinistra  Prima valuto l’espressione sulla destra, poi l’associo alla variabile a sinistra Dr. Paolo Casoto, Ph.D - 2012
  58. 58. + Assegnamento (1/2)  Assegnare un valore a una variabile  Il valore si ottiene, in generale, con un’espressione  Forma dell’assegnamento:  variabile = espressione;  Esempi  contatore = 0;  area = base * altezza / 2;  contatore = contatore + 1;  E’ possibile utilizzare costrutti più complessi come l’assegnamento composito  Assegno ed eseguo una espressione, e.g.: x*=2
  59. 59. + Assegnamento (2/2)  Valori sinistri e destri (left & right values)  A sinistra una variabile  A destra un’espressione  (caso particolare: una variabile)  Anche l’assegnamento deve rispettare i tipi  il tipo dell’espressione deve essere uguale al tipo della variabile, o “automaticamente promuovibile”  L’assegnamento è un’istruzione completa  Non è un’uguaglianza matematica!
  60. 60. + Commenti  Elementi del nostro codice ignorati dal compilatore ma da utilizzarsi per la corretta leggibilità e comprensione del codice  Su una riga:  // …  Su più righe:  /* … … */  Con all’interno contenuto XML  Utilizzabili per la generazione automatica della documentazione del codice  In modo del tutto analogo a JavaDoc in Java
  61. 61. + Istruzioni  Le istruzioni rappresentano le singole attività che devono essere eseguite per il corretto funzionamento di un programma  Caratterizzate dal terminatore ;  Possono essere raccolte in blocchi, caratterizzati dall’essere delimitati dalle parentesi graffe { }  Classificabili in:  Dichiarazioni  Espressioni  Selezioni  Cicli  Salti  Varie ed eventuali Dr. Paolo Casoto, Ph.D - 2012
  62. 62. + Esercizi Dr. Paolo Casoto, Ph.D - 2012
  63. 63. + Esercizio 1  La formula per il calcolo del perimetro di un rettangolo è: "due volte la somma della base più laltezza".  Si scriva un programma PerimetroRettangolo che assegna dei valori a vostra scelta alle variabili b e h e calcola e stampa il perimetro del rettangolo corrispondente. Scrivete ununica espressione, usando le parentesi dove opportuno.  Suggerimento: Ispiratevi al programma AreaTriangolo Dr. Paolo Casoto, Ph.D - 2011
  64. 64. + Esercizio 2  Scrivete un programma PerimetroEAreaQuadrato che assegna un valore a vostra scelta ad una variabile e calcola e stampa il perimetro e larea del quadrato corrispondente. Dr. Paolo Casoto, Ph.D - 2011
  65. 65. + Esercizio 3  La formula per il calcolo dellarea di un trapezio è: "somma delle basi per altezza diviso due".  Si scriva un programma AreaTrapezio che assegna dei valori a vostra scelta alle variabili b1, b2 e h e calcola larea del trapezio corrispondente.  Scrivete ununica espressione, usando le parentesi dove opportuno. Scegliete opportunamente il tipo delle variabili. Dr. Paolo Casoto, Ph.D - 2011
  66. 66. + Esercizio 4  La formula per il calcolo della circonferenza è: "due volte il raggio per 3.14".  Scrivete un programma Circonferenza che assegna un valore a vostra scelta alla variabile raggio e calcola la circonferenza del cerchio corrispondente.  Scegliete opportunamente il tipo della variabile raggio. Dr. Paolo Casoto, Ph.D - 2011
  67. 67. + Esercizio 5  Considerate il seguente programma: Dr. Paolo Casoto, Ph.D - 2011
  68. 68. + Esercizio 5  Aggiungete allinizio del programma una variabile lato e modificate le due istruzioni che calcolano il perimetro e larea in modo che venga utilizzata la variabile e non i numeri.  Modificate il programma per far stampare il perimetro e larea di un quadrato di lato 32.  Modificatelo per far stampare il perimetro e larea di un quadrato di lato 3333.  Ricompilate ed eseguite ogni volta. Dr. Paolo Casoto, Ph.D - 2011
  69. 69. + Esercizio 6  Scrivete un programma Espressioni per far calcolare e stampare il risultato delle seguenti espressioni aritmetiche:  {[32+24*(9-12)+7]*2-45}*11  12-[(8-5)*(2+4)]+345  5.4/32+43*(4/12+3)  Fate attenzione alle parentesi che utilizzate! Dr. Paolo Casoto, Ph.D - 2011
  70. 70. + Esercizio 7  Scrivete un programma VerificaEquazione che verifica la seguente equazione:  32+4*(12-4) = {[(2-3)*12]+2}/7 e stampa "Lequazione e vera" oppure "Lequazione e falsa".  Fate attenzione a quale segno di uguaglianza usate! Dr. Paolo Casoto, Ph.D - 2011
  71. 71. + Domande ??? Grazie a tutti per l’attenzione Dr. Paolo Casoto, Ph.D - 2012

×