SlideShare a Scribd company logo
1 of 44
Download to read offline
www.manuelscapolan.it
LEZIONE 03
.NET Framework Class Library
2
Exception Handling
Collections
Generics
File I/O
… and much more!
• Con gli Array possiamo gestire insiemi
non ordinati di elementi accessibili
tramite indice
• La Framework Class Library ci mette a
disposizione altri tipi di collezioni per
poter gestire:
– Insiemi ordinati
– Insiemi accessibili per chiave
– Insiemi di coppie chiave/valore
– Insiemi “tipizzati”
Collezioni di oggetti
3
• Tipi di collezioni in System.Collections:
Collezioni di oggetti
4
Tipo Caratteristiche
ArrayList Consente di implementare l'interfaccia IList utilizzando una matrice la cui
dimensione aumenta dinamicamente in base alle necessità
Hashtable Rappresenta un insieme di coppie chiave/valore organizzate in base al codice
hash della chiave.
BitArray Consente di gestire una matrice compatta di valori di bit, rappresentati come
Boolean, dove true indica che il bit è attivo (1), mentre false indica che il bit è
inattivo (0).
SortedList Rappresenta un insieme di coppie chiave/valore, ordinate in base alle chiavi e
accessibili per chiave e per indice.
Stack Rappresenta un semplice insieme non generico LIFO (Last-In, First-Out) di
oggetti.
Queue Rappresenta un insieme di oggetti FIFO (First-In First-Out).
• Rappresenta un insieme di coppie
chiave/valore organizzate in base al codice
hash della chiave
Hashtable
5
Coppia chiave/valore elemento di
una hashtable
• Stack: insieme di oggetti con accesso LIFO
(Last-In, First-Out)
• Queue: insieme di oggetti con accesso FIFO
(First-In, First-Out)
Stack e Queue
6
push
pop
enqueue dequeue
• Rappresenta un insieme di valori booleani
• Permette di eseguire delle operazioni di
confronto bit a bit:
– And
– Or
– Xor
– Not
BitArray
7
es. bitArray1.And(bitArray2)
bitArray1 viene modificato
dall’operazione di confronto!
• Voglio che sia bello, ricco e famoso!
BitArray: un esempio
8
• Il foreach permette di navigare una
collezione di oggetti uno dopo l’altro
• Possiamo farlo anche con le nostre classi
implementando l’interfaccia IEnumerable:
IEnumerable e ciclo foreach
9
• Definire un enumeratore personalizzato:
IEnumerable e IEnumerator
10
• Con i generics riesco a separare la logica di
un algoritmo dal tipo di dato sul quale viene
applicato (“algorithm reuse”)
Generics
11
Devo fare un cast
E’ tipizzato!
Tipo ”aperto” (non può
essere istanziato)
• Per dichiarare un tipo generico bisogna
specificare dopo l’identificativo della classe
un tipo T tra le parentesi angolate < e >
• Nel momento in cui vado a inizializzalo
andrò a specificare il tipo concreto
Dichiarare un tipo generico
12
Generalmente i tipi generici
hanno come nomi T, U, V,
etc., ma posso chiamarli
come voglio …
• Collezioni in System.Collections.Generic:
Collezioni “generiche”
13
Tipo generico Controparte non generica
List<T> ArrayList
Dictionary<Tkey, TValue> Hashtable
SortedDictionary<Tkey, Tvalue> SortedList
(nessuna) BitArray
LinkedList<T> (nessuna)
Stack<T> Stack
Queue<T> Queue
• Vi ricordate dei Nullable Types?
• Sono realizzati tramite i generics!
• La logica è comune per tutti i tipi: verificare
se esite un valore assegnato ad una variabile
di tipo Value Type
Nullable<T>
14
int?
Do you remember?
• L’utilizzo dei generics porta ad avere i
seguenti benefici:
– Incapsulamento dell’algoritmo
Separo la logica dai dati nascondendo l’algoritmo
all’utilizzatore
– Verifica a compile-time sui tipi
Il compilatore previene cast non validi
– Codice più pulito
Non devo fare cast o istanziare variabili intermedie
– Migliori performance
Con i value type non ho bisogno di fare boxing/unboxing
Benefici dei generics
15
• Verifica delle performance con aggiunta e
accesso per indice:
Verifichiamo le performance
16
ArrayList List<T>VS
• Il compilatore verifica che l’utilizzo di T valga
per tutti i tipi (presenti e futuri)
Verifica su T
17
Tutti i tipi hanno un
metodo GetType perché
ereditato da object
NON tutti i tipi hanno
un metodo CompareTo,
solo quelli che
implementano
l’interfaccia IComparable
• Se voglio definire del codice generico solo
per un insieme ristretto di tipi, devo porre dei
vincoli su T attraverso la parola chiave where
• Vincolo sul costruttore:
Vincoli sul tipo T
18
Impostare sempre il
vincolo più stringente
TIP:
compile-time runtime
• I generics possono essere anche applicati ai metodi
ed essere utilizzati come parametri e valori di ritorno
Generic Methods
19
• Utilizzo di T come variabile
Chiamata per inferenza di tipo
• Le classi generiche sono tipi a tutti gli effetti
e come tali possono essere ereditate, con
qualche precisazione:
– Se una classe non-generica estende una classe
generica, la derivata deve specificare il tipo di
parametro
– Se la classe base definisce un metodo generico
astratto o vrtuale, la derivata deve eseguire
l’override specificando il tipo di parametro
– Se una classe derivata è anch’essa generica
può riutilizzare il tipo di parametro della classe
base
Ereditarietà con i generics
20
• L’ereditarietà tra classi generiche non
comprende automaticamente anche i tipi
Ereditarietà con i generics
21
• La covarianza è la possibilità di utilizzare un
tipo più derivato di quello specificato in
origine
– Si ottiene nei tipi generici aggiungendo alla
definizione del parametro la parola chiave out
• La controvarianza è la possibilità di utilizzare
un tipo meno derivato
– Si ottiene nei tipi generici aggiungendo alla
definizione del parametro la parola chiave in
Covarianza e Controvarianza
22
• La “Tupla” è un insieme di dimensioni fisse di
dati tipizzati eterogenei
• Può essere utilizzata per far tornare ad un
metodo più di un valore
Tuple
23
1) Riscrivere l’esempio del “tempo di
cottura” della lezione precedente
utilizzando i generics
2) Scrivere una classe generica che
permetta di distribuire le informazioni
di una lista (generica anch’essa) in n
parti uguali. Il numero di parti viene
passato al costruttore
Esercizi
24
• Una eccezione è una condizione di errore
che interrompe il normale flusso operativo
del programma
• L'eccezione viene propagata nello stack di
chiamate finché non viene gestita
• Le eccezioni non gestite (unhandled
exception) vengono riportate dal sistema
direttamente nell’interfaccia utente
Gestione delle eccezioni
25
• E’ possibile catturare le eccezioni che si
verificano in un blocco di codice attraverso
il costrutto try … catch
Catturare una eccezione
26
Blocco di codice
sotto controllo
delle eccezioni
Cattura l’eccezione
specifica Gestione dell’errore
specifico
Eccezione di base da cui derivano tutte
le eccezioni
• E’ possibile specificare diversi catch in
cascata per gestire diversi tipi di eccezione
Tipi di eccezioni
27
Deve essere lasciato
per ultimo perché più
generico
• Alle volte, indipendentemente dall’errore
che viene sollevato, è necessario eseguire
del codice, lo possiamo fare inserendolo in
un blocco finally
“Pulizia finale” con Finally
28
• Classe base per tutte le eccezioni:
System.Exception
29
Membro Tipo Descrizione
Message String Descrizione tecnica dell’errore. Normalmente viene salvata in
un log e non è buona norma mostrarla all’utente
Data Dictionary Dizionario di parametri passato da chi solleva l’eccezione a
chi la gestisce
Source String Nome dell’assembly che ha generato l’errore
StackTrace String Contiene nomi e firme delle chiamate ai metodi dal punto in
cui è stato generato l’errore
TargetSite MethodBase Metodo che ha scatenato l’errore
InnerException Exception Rappresenta l’eccezione precedentemente sollevata se quella
corrente è stata sollevata in un altro gestore
• Se in un nostro metodo non riusciamo a
completare un’operazione e vogliamo
esplicitare con un errore questa condizione
è possibile ritornare al chiamante una
eccezione con la parola chiave throw
• In questo caso dobbiamo scegliere quale
tipo di eccezione sollevare e un messaggio
che spiega perché non è stato possibile
completare l’operazione
“Sollevare” una eccezione
30
• Oltre alle eccezioni fornite con la Framework
Class Library possiamo definire le nostre
eccezioni ereditando dalla classe Exception
(o da un’altra classe più specifica)
Definire una nuova eccezione
31
• Validare i parametri di ingresso al metodo
• Non utilizzare il throw come modo per effettuare un
ritorno dal metodo corrente
• Utilizzare dove possibile il finally per pulire le risorse
• Non eseguire il catch di tutto (vedi Exception)
• Se si conosce il motivo di una eccezione
comunicarlo all’utente
• Implementare dove possibile un ripristino di una
situazione consistente
• Evitare di esporre con le eccezioni dettagli
implementativi, eventualmente eseguire un re-
throw di una eccezione differente
Gestione delle eccezioni – Tips
32
• In System.IO troviamo una serie di classi per
gestire gli input-output da file e in memoria
System.IO: lavorare con i file
33
Tipo Descrizione
BinaryReader
BinaryWriter
These classes allow you to store and retrieve primitive data types (integers,
Booleans, strings, and whatnot) as a binary value.
BufferedStream
This class provides temporary storage for a stream of bytes that you can
commit to storage at a later time.
Directory
DirectoryInfo
You use these classes to manipulate a machine’s directory structure.
The Directory type exposes functionality using static members, while
the DirectoryInfo from a valid object reference.
DriveInfo This class provides detailed information regarding the drives
File
FileInfo
You use these classes to manipulate a machine’s set of files. The File
type exposes functionality using static members, while the FileInfo
type exposes similar functionality from a valid object reference.
System.IO: lavorare con i file
34
Tipo Descrizione
FileStream
This class gives you random file access (e.g., seeking capabilities) with
data represented as a stream of bytes.
FileSystemWatcher
This class allows you to monitor the modification of external files in a
specified directory.
MemoryStream
This class provides random access to streamed data stored in memory
rather than a physical file.
Path
This class performs operations on System.String types that contain file
or directory path information in a platform-neutral manner.
StreamWriter
StreamReader
You use these classes to store (and retrieve) textual information to (or
from) a file. These types do not support random file access.
StringWriter
StringReader
Like the StreamReader/StreamWriter classes, these classes also work
with textual information. However, the underlying storage is a string
buffer rather than a physical file.
• Tra le altre classi troviamo le classi astratte
Stream, TextReader e TextWriter
• Le classi Directory e File consentono di
operare sul file system tramite metodi statici,
mentre le controparti FileInfo e DirectoryInfo
lavorano a livello di istanza
Directory(Info) e File(Info)
35
Creazione di un
nuovo file
Lista di file presenti
in una directory
• Ci sono molti modi per lavorare con i file uno
di questi è attraverso i metodi ReadAllLines()
e WriteAllLines()
Leggere e scrivere: un modo veloce
36
Con WriteAllLines
se non esiste il file
viene creato in quel
momento
• Uno stream rappresenta una sequenza di
dati scambiati tra una sorgente e una
destinazione
• La classe astratta System.IO.Stream
definisce una serie di membri a supporto
delle interazioni sincrone e asincrone con lo
storage (es. file o locazioni di memoria)
La classe astratta Stream
37
Alcuni membri della classe asratta Stream
CanRead
CanWrite
CanSeek
Close() Flush()
Length
SetLength()
Seek() Position
Read()
ReadByte()
Write()
WriteByte()
• La classe FileStream è l’implementazione
della classe Stream per lo streaming su file
FileStream
38
Decodifica da
byte a string
Codifica da
string a byte
Lettura byte a byte
con ReadByte()
Scrittura byte sullo stream
• La classe StreamWriter definisce un wrapper
sullo stream per scrivere dati in formato testo
• Deriva dalla classe astratta TextWriter:
StreamWriter
39
Membro Descrizione
Close()
Closes the writer and frees any associated resources. In the process, the
buffer is automatically flushed
Flush()
Clears all buffers for the current writer and causes any buffered data to
be written to the underlying device;. It does not close the writer
NewLine
This property indicates the newline constant for the derived writer
class. The default line terminator for the Windows OS is a carriage
return, followed by a line feed (rn)
Write()
This overloaded method writes data to the text stream without a
newline constant
WriteLine()
This overloaded method writes data to the text stream with a newline
constant
• Vediamo la classe StreamWriter in azione:
Scrivere su file di testo
40
All’uscita dal blocco di istruzioni
chiude il file e rilascia le risorse Crea un nuovo file o apre in
scrittura quello esistente
Inserisco nel file una nuova rigaScrivo del testo sul file
Con Autoflush = true la scrittura sul file avviene dopo ogni write, con
Autoflush = false (predefinito) la scrittura viene fatta al momento del Close()
NOTA:
• Con la classe StreamReader leggiamo il
contenuto del file di testo
StreamReader: leggere da file di testo
41
Membri della classe StreamReader
Peek() Read() ReadLine()
ReadBlock() ReadToEnd()
Legge tutto il file dalla posizione corrente
fino alla fine e mette tutto in una stringaMette in un buffer il numero di caratteri
specificato come parametro
Null == EOF
Posso creare una nuova
istanza di StreamReader
specificando il percorso
del file da leggere
• Posso utilizzare le classi StringWriter e
StringReader per scrivere e leggere stringhe
di caratteri in memoria
StringWriter e StringReader
42
Scrivere testo
in memoria
Leggere testo
dalla memoria
3) Scrivere una funzione ricorsiva che
visualizzi sulla console la struttura di file
e cartelle di una directory specificata
(con la possibilità di definire un
numero di livelli di profondità)
4) Scrivere un metodo che inserisca in
un file di testo i numeri di riga
Esercizi
43
Slide 2 : http://www.flickr.com/photos/ajc1/4663140532
Credits
Le immagini contenute in questa presentazione
hanno licenza Creative Commons
Contacts MANUEL SCAPOLAN
website: www.manuelscapolan.it
twitter: manuelscapolan
e-mail: info@manuelscapolan.it
44

More Related Content

What's hot

Object Oriented with Java Programmazione Base
Object Oriented with Java Programmazione BaseObject Oriented with Java Programmazione Base
Object Oriented with Java Programmazione BaseFelice Pescatore
 
programmazione ad oggetti
programmazione ad oggettiprogrammazione ad oggetti
programmazione ad oggettimariacaporale
 
Lezione 10 - Programmazione ad oggetti
Lezione 10 - Programmazione ad oggettiLezione 10 - Programmazione ad oggetti
Lezione 10 - Programmazione ad oggettiGiuseppe Cramarossa
 
Programmazione ad oggetti
Programmazione ad oggettiProgrammazione ad oggetti
Programmazione ad oggettiLorena Rojas
 
Presentazione Oz - Mozart
Presentazione Oz - MozartPresentazione Oz - Mozart
Presentazione Oz - Mozartfede
 
Programmazione ad oggetti
Programmazione ad oggettiProgrammazione ad oggetti
Programmazione ad oggettimariacaporale
 
Presentazione primi principi oop
Presentazione primi principi oopPresentazione primi principi oop
Presentazione primi principi oopyrcorr
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#Marco Parenzan
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java BaseK-Tech Formazione
 
05 2 integrali-conversioni-costanti-preproc-inclusione
05 2 integrali-conversioni-costanti-preproc-inclusione05 2 integrali-conversioni-costanti-preproc-inclusione
05 2 integrali-conversioni-costanti-preproc-inclusionePiero Fraternali
 
Corso Iphone in 48h
Corso Iphone in 48hCorso Iphone in 48h
Corso Iphone in 48hFLT.lab
 
Programmazione ad oggetti
Programmazione ad oggettiProgrammazione ad oggetti
Programmazione ad oggettiAnna_1969
 

What's hot (20)

Object Oriented with Java Programmazione Base
Object Oriented with Java Programmazione BaseObject Oriented with Java Programmazione Base
Object Oriented with Java Programmazione Base
 
Pe t4 perl-oggetti
Pe t4 perl-oggettiPe t4 perl-oggetti
Pe t4 perl-oggetti
 
programmazione ad oggetti
programmazione ad oggettiprogrammazione ad oggetti
programmazione ad oggetti
 
Design Pattern
Design PatternDesign Pattern
Design Pattern
 
Lezione 10 - Programmazione ad oggetti
Lezione 10 - Programmazione ad oggettiLezione 10 - Programmazione ad oggetti
Lezione 10 - Programmazione ad oggetti
 
Java OCA teoria 4
Java OCA teoria 4Java OCA teoria 4
Java OCA teoria 4
 
Programmazione ad oggetti
Programmazione ad oggettiProgrammazione ad oggetti
Programmazione ad oggetti
 
Presentazione Oz - Mozart
Presentazione Oz - MozartPresentazione Oz - Mozart
Presentazione Oz - Mozart
 
Programmazione ad oggetti
Programmazione ad oggettiProgrammazione ad oggetti
Programmazione ad oggetti
 
Presentazione primi principi oop
Presentazione primi principi oopPresentazione primi principi oop
Presentazione primi principi oop
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#
 
Java5
Java5Java5
Java5
 
2006 Py03 intermedio
2006 Py03 intermedio2006 Py03 intermedio
2006 Py03 intermedio
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java Base
 
05 2 integrali-conversioni-costanti-preproc-inclusione
05 2 integrali-conversioni-costanti-preproc-inclusione05 2 integrali-conversioni-costanti-preproc-inclusione
05 2 integrali-conversioni-costanti-preproc-inclusione
 
06 3 struct
06 3 struct06 3 struct
06 3 struct
 
Corso Iphone in 48h
Corso Iphone in 48hCorso Iphone in 48h
Corso Iphone in 48h
 
iOS_Course_6
iOS_Course_6iOS_Course_6
iOS_Course_6
 
Corso Java 2 - AVANZATO
Corso Java 2 - AVANZATOCorso Java 2 - AVANZATO
Corso Java 2 - AVANZATO
 
Programmazione ad oggetti
Programmazione ad oggettiProgrammazione ad oggetti
Programmazione ad oggetti
 

Viewers also liked

Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Manuel Scapolan
 
Tutte le novità di ASP.NET MVC3
Tutte le novità di ASP.NET MVC3Tutte le novità di ASP.NET MVC3
Tutte le novità di ASP.NET MVC3Manuel Scapolan
 
AntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreAntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreManuel Scapolan
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object OrientedManuel Scapolan
 
TFS and Scrum - Lessons Learned
TFS and Scrum - Lessons LearnedTFS and Scrum - Lessons Learned
TFS and Scrum - Lessons LearnedManuel Scapolan
 
Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRSManuel Scapolan
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateManuel Scapolan
 
Stai guardando i dati sbagliati
Stai guardando i dati sbagliatiStai guardando i dati sbagliati
Stai guardando i dati sbagliatiAlberto Brandolini
 
Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!Manuel Scapolan
 
Costruire l'identità digitale con il piano editoriale
Costruire l'identità digitale con il piano editorialeCostruire l'identità digitale con il piano editoriale
Costruire l'identità digitale con il piano editorialeFederico Venturini
 
Object-oriented Programming-with C#
Object-oriented Programming-with C#Object-oriented Programming-with C#
Object-oriented Programming-with C#Doncho Minkov
 

Viewers also liked (17)

Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)
 
Tutte le novità di ASP.NET MVC3
Tutte le novità di ASP.NET MVC3Tutte le novità di ASP.NET MVC3
Tutte le novità di ASP.NET MVC3
 
AntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreAntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatore
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object Oriented
 
JavaScript
JavaScriptJavaScript
JavaScript
 
TFS and Scrum - Lessons Learned
TFS and Scrum - Lessons LearnedTFS and Scrum - Lessons Learned
TFS and Scrum - Lessons Learned
 
Knockout.js
Knockout.jsKnockout.js
Knockout.js
 
Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRS
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernate
 
Stai guardando i dati sbagliati
Stai guardando i dati sbagliatiStai guardando i dati sbagliati
Stai guardando i dati sbagliati
 
NOSQL
NOSQLNOSQL
NOSQL
 
Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!
 
Costruire l'identità digitale con il piano editoriale
Costruire l'identità digitale con il piano editorialeCostruire l'identità digitale con il piano editoriale
Costruire l'identità digitale con il piano editoriale
 
Liberate il kraken
Liberate il krakenLiberate il kraken
Liberate il kraken
 
HTML e CSS
HTML e CSSHTML e CSS
HTML e CSS
 
Object-oriented Programming-with C#
Object-oriented Programming-with C#Object-oriented Programming-with C#
Object-oriented Programming-with C#
 
Transactions redefined
Transactions redefinedTransactions redefined
Transactions redefined
 

Similar to C# e la Framework Class Library

Corso Python Deltapromo lezione 1
Corso Python Deltapromo   lezione 1Corso Python Deltapromo   lezione 1
Corso Python Deltapromo lezione 1Paolo Ferretti
 
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in DelphiMarco Breveglieri
 
Lezione 08 - Iterator
Lezione 08 - IteratorLezione 08 - Iterator
Lezione 08 - IteratorMarco Bianchi
 
Analisi delle differenze strutturali nelle espressioni regolari costruite da ...
Analisi delle differenze strutturali nelle espressioni regolari costruite da ...Analisi delle differenze strutturali nelle espressioni regolari costruite da ...
Analisi delle differenze strutturali nelle espressioni regolari costruite da ...Marco Potok
 
Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...
Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...
Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...Giuseppe Cramarossa
 
Lezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern ComportamentaliLezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern ComportamentaliAndrea Della Corte
 
Lezione 7: Design Pattern Comportamentali
Lezione 7: Design Pattern ComportamentaliLezione 7: Design Pattern Comportamentali
Lezione 7: Design Pattern ComportamentaliAndrea Della Corte
 
Design pattern template method
Design pattern template methodDesign pattern template method
Design pattern template methodNelson Firmani
 
Lezione 5: Design Pattern Creazionali
Lezione 5: Design Pattern CreazionaliLezione 5: Design Pattern Creazionali
Lezione 5: Design Pattern CreazionaliAndrea Della Corte
 
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Bruno Interlandi
 
Webbit 2004: Tiger, java
Webbit 2004: Tiger, javaWebbit 2004: Tiger, java
Webbit 2004: Tiger, javaMatteo Baccan
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScriptGiovanni Buffa
 
06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedefPiero Fraternali
 

Similar to C# e la Framework Class Library (20)

Relaxed FD Discoverer
Relaxed FD DiscovererRelaxed FD Discoverer
Relaxed FD Discoverer
 
Java Lezione 1
Java Lezione 1Java Lezione 1
Java Lezione 1
 
Corso Python Deltapromo lezione 1
Corso Python Deltapromo   lezione 1Corso Python Deltapromo   lezione 1
Corso Python Deltapromo lezione 1
 
Template
TemplateTemplate
Template
 
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
 
Lezione 08 - Iterator
Lezione 08 - IteratorLezione 08 - Iterator
Lezione 08 - Iterator
 
Analisi delle differenze strutturali nelle espressioni regolari costruite da ...
Analisi delle differenze strutturali nelle espressioni regolari costruite da ...Analisi delle differenze strutturali nelle espressioni regolari costruite da ...
Analisi delle differenze strutturali nelle espressioni regolari costruite da ...
 
Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...
Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...
Programmazione di applicazioni UWP - Dalle basi del C# alla creazione di un’a...
 
Lezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern ComportamentaliLezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern Comportamentali
 
Lezione 7: Design Pattern Comportamentali
Lezione 7: Design Pattern ComportamentaliLezione 7: Design Pattern Comportamentali
Lezione 7: Design Pattern Comportamentali
 
Design pattern template method
Design pattern template methodDesign pattern template method
Design pattern template method
 
Java OCA teoria 5
Java OCA teoria 5Java OCA teoria 5
Java OCA teoria 5
 
Java OCA teoria 1
Java OCA teoria 1Java OCA teoria 1
Java OCA teoria 1
 
Lezione 5: Design Pattern Creazionali
Lezione 5: Design Pattern CreazionaliLezione 5: Design Pattern Creazionali
Lezione 5: Design Pattern Creazionali
 
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
 
Webbit 2004: Tiger, java
Webbit 2004: Tiger, javaWebbit 2004: Tiger, java
Webbit 2004: Tiger, java
 
Ruby in 25 minuti
Ruby in 25 minutiRuby in 25 minuti
Ruby in 25 minuti
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScript
 
Repository pattern
Repository patternRepository pattern
Repository pattern
 
06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedef
 

Recently uploaded

Esame finale - riunione genitori 2024.pptx
Esame finale - riunione genitori 2024.pptxEsame finale - riunione genitori 2024.pptx
Esame finale - riunione genitori 2024.pptxfedericodellacosta2
 
La produzione e la gestione degli Open Data
La produzione e la gestione degli Open DataLa produzione e la gestione degli Open Data
La produzione e la gestione degli Open DataGianluigi Cogo
 
Esperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superioreEsperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superiorevaleriodinoia35
 
lezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldilezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldivaleriodinoia35
 
Storia dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptxStoria dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptxOrianaOcchino
 
La seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieLa seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieVincenzoPantalena1
 
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaIL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaRafael Figueredo
 
Ticonzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaTiconzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaPierLuigi Albini
 

Recently uploaded (8)

Esame finale - riunione genitori 2024.pptx
Esame finale - riunione genitori 2024.pptxEsame finale - riunione genitori 2024.pptx
Esame finale - riunione genitori 2024.pptx
 
La produzione e la gestione degli Open Data
La produzione e la gestione degli Open DataLa produzione e la gestione degli Open Data
La produzione e la gestione degli Open Data
 
Esperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superioreEsperimenti_laboratorio di fisica per la scuola superiore
Esperimenti_laboratorio di fisica per la scuola superiore
 
lezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldilezione di fisica_I moti nel piano_Amaldi
lezione di fisica_I moti nel piano_Amaldi
 
Storia dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptxStoria dell’Inghilterra nell’Età Moderna.pptx
Storia dell’Inghilterra nell’Età Moderna.pptx
 
La seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medieLa seconda guerra mondiale per licei e scuole medie
La seconda guerra mondiale per licei e scuole medie
 
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla CresimaIL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
IL CHIAMATO ALLA CONVERSIONE - catechesi per candidati alla Cresima
 
Ticonzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza culturaTiconzero news 148.pdf aprile 2024 Terza cultura
Ticonzero news 148.pdf aprile 2024 Terza cultura
 

C# e la Framework Class Library

  • 2. .NET Framework Class Library 2 Exception Handling Collections Generics File I/O … and much more!
  • 3. • Con gli Array possiamo gestire insiemi non ordinati di elementi accessibili tramite indice • La Framework Class Library ci mette a disposizione altri tipi di collezioni per poter gestire: – Insiemi ordinati – Insiemi accessibili per chiave – Insiemi di coppie chiave/valore – Insiemi “tipizzati” Collezioni di oggetti 3
  • 4. • Tipi di collezioni in System.Collections: Collezioni di oggetti 4 Tipo Caratteristiche ArrayList Consente di implementare l'interfaccia IList utilizzando una matrice la cui dimensione aumenta dinamicamente in base alle necessità Hashtable Rappresenta un insieme di coppie chiave/valore organizzate in base al codice hash della chiave. BitArray Consente di gestire una matrice compatta di valori di bit, rappresentati come Boolean, dove true indica che il bit è attivo (1), mentre false indica che il bit è inattivo (0). SortedList Rappresenta un insieme di coppie chiave/valore, ordinate in base alle chiavi e accessibili per chiave e per indice. Stack Rappresenta un semplice insieme non generico LIFO (Last-In, First-Out) di oggetti. Queue Rappresenta un insieme di oggetti FIFO (First-In First-Out).
  • 5. • Rappresenta un insieme di coppie chiave/valore organizzate in base al codice hash della chiave Hashtable 5 Coppia chiave/valore elemento di una hashtable
  • 6. • Stack: insieme di oggetti con accesso LIFO (Last-In, First-Out) • Queue: insieme di oggetti con accesso FIFO (First-In, First-Out) Stack e Queue 6 push pop enqueue dequeue
  • 7. • Rappresenta un insieme di valori booleani • Permette di eseguire delle operazioni di confronto bit a bit: – And – Or – Xor – Not BitArray 7 es. bitArray1.And(bitArray2) bitArray1 viene modificato dall’operazione di confronto!
  • 8. • Voglio che sia bello, ricco e famoso! BitArray: un esempio 8
  • 9. • Il foreach permette di navigare una collezione di oggetti uno dopo l’altro • Possiamo farlo anche con le nostre classi implementando l’interfaccia IEnumerable: IEnumerable e ciclo foreach 9
  • 10. • Definire un enumeratore personalizzato: IEnumerable e IEnumerator 10
  • 11. • Con i generics riesco a separare la logica di un algoritmo dal tipo di dato sul quale viene applicato (“algorithm reuse”) Generics 11 Devo fare un cast E’ tipizzato! Tipo ”aperto” (non può essere istanziato)
  • 12. • Per dichiarare un tipo generico bisogna specificare dopo l’identificativo della classe un tipo T tra le parentesi angolate < e > • Nel momento in cui vado a inizializzalo andrò a specificare il tipo concreto Dichiarare un tipo generico 12 Generalmente i tipi generici hanno come nomi T, U, V, etc., ma posso chiamarli come voglio …
  • 13. • Collezioni in System.Collections.Generic: Collezioni “generiche” 13 Tipo generico Controparte non generica List<T> ArrayList Dictionary<Tkey, TValue> Hashtable SortedDictionary<Tkey, Tvalue> SortedList (nessuna) BitArray LinkedList<T> (nessuna) Stack<T> Stack Queue<T> Queue
  • 14. • Vi ricordate dei Nullable Types? • Sono realizzati tramite i generics! • La logica è comune per tutti i tipi: verificare se esite un valore assegnato ad una variabile di tipo Value Type Nullable<T> 14 int? Do you remember?
  • 15. • L’utilizzo dei generics porta ad avere i seguenti benefici: – Incapsulamento dell’algoritmo Separo la logica dai dati nascondendo l’algoritmo all’utilizzatore – Verifica a compile-time sui tipi Il compilatore previene cast non validi – Codice più pulito Non devo fare cast o istanziare variabili intermedie – Migliori performance Con i value type non ho bisogno di fare boxing/unboxing Benefici dei generics 15
  • 16. • Verifica delle performance con aggiunta e accesso per indice: Verifichiamo le performance 16 ArrayList List<T>VS
  • 17. • Il compilatore verifica che l’utilizzo di T valga per tutti i tipi (presenti e futuri) Verifica su T 17 Tutti i tipi hanno un metodo GetType perché ereditato da object NON tutti i tipi hanno un metodo CompareTo, solo quelli che implementano l’interfaccia IComparable
  • 18. • Se voglio definire del codice generico solo per un insieme ristretto di tipi, devo porre dei vincoli su T attraverso la parola chiave where • Vincolo sul costruttore: Vincoli sul tipo T 18 Impostare sempre il vincolo più stringente TIP:
  • 19. compile-time runtime • I generics possono essere anche applicati ai metodi ed essere utilizzati come parametri e valori di ritorno Generic Methods 19 • Utilizzo di T come variabile Chiamata per inferenza di tipo
  • 20. • Le classi generiche sono tipi a tutti gli effetti e come tali possono essere ereditate, con qualche precisazione: – Se una classe non-generica estende una classe generica, la derivata deve specificare il tipo di parametro – Se la classe base definisce un metodo generico astratto o vrtuale, la derivata deve eseguire l’override specificando il tipo di parametro – Se una classe derivata è anch’essa generica può riutilizzare il tipo di parametro della classe base Ereditarietà con i generics 20
  • 21. • L’ereditarietà tra classi generiche non comprende automaticamente anche i tipi Ereditarietà con i generics 21
  • 22. • La covarianza è la possibilità di utilizzare un tipo più derivato di quello specificato in origine – Si ottiene nei tipi generici aggiungendo alla definizione del parametro la parola chiave out • La controvarianza è la possibilità di utilizzare un tipo meno derivato – Si ottiene nei tipi generici aggiungendo alla definizione del parametro la parola chiave in Covarianza e Controvarianza 22
  • 23. • La “Tupla” è un insieme di dimensioni fisse di dati tipizzati eterogenei • Può essere utilizzata per far tornare ad un metodo più di un valore Tuple 23
  • 24. 1) Riscrivere l’esempio del “tempo di cottura” della lezione precedente utilizzando i generics 2) Scrivere una classe generica che permetta di distribuire le informazioni di una lista (generica anch’essa) in n parti uguali. Il numero di parti viene passato al costruttore Esercizi 24
  • 25. • Una eccezione è una condizione di errore che interrompe il normale flusso operativo del programma • L'eccezione viene propagata nello stack di chiamate finché non viene gestita • Le eccezioni non gestite (unhandled exception) vengono riportate dal sistema direttamente nell’interfaccia utente Gestione delle eccezioni 25
  • 26. • E’ possibile catturare le eccezioni che si verificano in un blocco di codice attraverso il costrutto try … catch Catturare una eccezione 26 Blocco di codice sotto controllo delle eccezioni Cattura l’eccezione specifica Gestione dell’errore specifico Eccezione di base da cui derivano tutte le eccezioni
  • 27. • E’ possibile specificare diversi catch in cascata per gestire diversi tipi di eccezione Tipi di eccezioni 27 Deve essere lasciato per ultimo perché più generico
  • 28. • Alle volte, indipendentemente dall’errore che viene sollevato, è necessario eseguire del codice, lo possiamo fare inserendolo in un blocco finally “Pulizia finale” con Finally 28
  • 29. • Classe base per tutte le eccezioni: System.Exception 29 Membro Tipo Descrizione Message String Descrizione tecnica dell’errore. Normalmente viene salvata in un log e non è buona norma mostrarla all’utente Data Dictionary Dizionario di parametri passato da chi solleva l’eccezione a chi la gestisce Source String Nome dell’assembly che ha generato l’errore StackTrace String Contiene nomi e firme delle chiamate ai metodi dal punto in cui è stato generato l’errore TargetSite MethodBase Metodo che ha scatenato l’errore InnerException Exception Rappresenta l’eccezione precedentemente sollevata se quella corrente è stata sollevata in un altro gestore
  • 30. • Se in un nostro metodo non riusciamo a completare un’operazione e vogliamo esplicitare con un errore questa condizione è possibile ritornare al chiamante una eccezione con la parola chiave throw • In questo caso dobbiamo scegliere quale tipo di eccezione sollevare e un messaggio che spiega perché non è stato possibile completare l’operazione “Sollevare” una eccezione 30
  • 31. • Oltre alle eccezioni fornite con la Framework Class Library possiamo definire le nostre eccezioni ereditando dalla classe Exception (o da un’altra classe più specifica) Definire una nuova eccezione 31
  • 32. • Validare i parametri di ingresso al metodo • Non utilizzare il throw come modo per effettuare un ritorno dal metodo corrente • Utilizzare dove possibile il finally per pulire le risorse • Non eseguire il catch di tutto (vedi Exception) • Se si conosce il motivo di una eccezione comunicarlo all’utente • Implementare dove possibile un ripristino di una situazione consistente • Evitare di esporre con le eccezioni dettagli implementativi, eventualmente eseguire un re- throw di una eccezione differente Gestione delle eccezioni – Tips 32
  • 33. • In System.IO troviamo una serie di classi per gestire gli input-output da file e in memoria System.IO: lavorare con i file 33 Tipo Descrizione BinaryReader BinaryWriter These classes allow you to store and retrieve primitive data types (integers, Booleans, strings, and whatnot) as a binary value. BufferedStream This class provides temporary storage for a stream of bytes that you can commit to storage at a later time. Directory DirectoryInfo You use these classes to manipulate a machine’s directory structure. The Directory type exposes functionality using static members, while the DirectoryInfo from a valid object reference. DriveInfo This class provides detailed information regarding the drives File FileInfo You use these classes to manipulate a machine’s set of files. The File type exposes functionality using static members, while the FileInfo type exposes similar functionality from a valid object reference.
  • 34. System.IO: lavorare con i file 34 Tipo Descrizione FileStream This class gives you random file access (e.g., seeking capabilities) with data represented as a stream of bytes. FileSystemWatcher This class allows you to monitor the modification of external files in a specified directory. MemoryStream This class provides random access to streamed data stored in memory rather than a physical file. Path This class performs operations on System.String types that contain file or directory path information in a platform-neutral manner. StreamWriter StreamReader You use these classes to store (and retrieve) textual information to (or from) a file. These types do not support random file access. StringWriter StringReader Like the StreamReader/StreamWriter classes, these classes also work with textual information. However, the underlying storage is a string buffer rather than a physical file. • Tra le altre classi troviamo le classi astratte Stream, TextReader e TextWriter
  • 35. • Le classi Directory e File consentono di operare sul file system tramite metodi statici, mentre le controparti FileInfo e DirectoryInfo lavorano a livello di istanza Directory(Info) e File(Info) 35 Creazione di un nuovo file Lista di file presenti in una directory
  • 36. • Ci sono molti modi per lavorare con i file uno di questi è attraverso i metodi ReadAllLines() e WriteAllLines() Leggere e scrivere: un modo veloce 36 Con WriteAllLines se non esiste il file viene creato in quel momento
  • 37. • Uno stream rappresenta una sequenza di dati scambiati tra una sorgente e una destinazione • La classe astratta System.IO.Stream definisce una serie di membri a supporto delle interazioni sincrone e asincrone con lo storage (es. file o locazioni di memoria) La classe astratta Stream 37 Alcuni membri della classe asratta Stream CanRead CanWrite CanSeek Close() Flush() Length SetLength() Seek() Position Read() ReadByte() Write() WriteByte()
  • 38. • La classe FileStream è l’implementazione della classe Stream per lo streaming su file FileStream 38 Decodifica da byte a string Codifica da string a byte Lettura byte a byte con ReadByte() Scrittura byte sullo stream
  • 39. • La classe StreamWriter definisce un wrapper sullo stream per scrivere dati in formato testo • Deriva dalla classe astratta TextWriter: StreamWriter 39 Membro Descrizione Close() Closes the writer and frees any associated resources. In the process, the buffer is automatically flushed Flush() Clears all buffers for the current writer and causes any buffered data to be written to the underlying device;. It does not close the writer NewLine This property indicates the newline constant for the derived writer class. The default line terminator for the Windows OS is a carriage return, followed by a line feed (rn) Write() This overloaded method writes data to the text stream without a newline constant WriteLine() This overloaded method writes data to the text stream with a newline constant
  • 40. • Vediamo la classe StreamWriter in azione: Scrivere su file di testo 40 All’uscita dal blocco di istruzioni chiude il file e rilascia le risorse Crea un nuovo file o apre in scrittura quello esistente Inserisco nel file una nuova rigaScrivo del testo sul file Con Autoflush = true la scrittura sul file avviene dopo ogni write, con Autoflush = false (predefinito) la scrittura viene fatta al momento del Close() NOTA:
  • 41. • Con la classe StreamReader leggiamo il contenuto del file di testo StreamReader: leggere da file di testo 41 Membri della classe StreamReader Peek() Read() ReadLine() ReadBlock() ReadToEnd() Legge tutto il file dalla posizione corrente fino alla fine e mette tutto in una stringaMette in un buffer il numero di caratteri specificato come parametro Null == EOF Posso creare una nuova istanza di StreamReader specificando il percorso del file da leggere
  • 42. • Posso utilizzare le classi StringWriter e StringReader per scrivere e leggere stringhe di caratteri in memoria StringWriter e StringReader 42 Scrivere testo in memoria Leggere testo dalla memoria
  • 43. 3) Scrivere una funzione ricorsiva che visualizzi sulla console la struttura di file e cartelle di una directory specificata (con la possibilità di definire un numero di livelli di profondità) 4) Scrivere un metodo che inserisca in un file di testo i numeri di riga Esercizi 43
  • 44. Slide 2 : http://www.flickr.com/photos/ajc1/4663140532 Credits Le immagini contenute in questa presentazione hanno licenza Creative Commons Contacts MANUEL SCAPOLAN website: www.manuelscapolan.it twitter: manuelscapolan e-mail: info@manuelscapolan.it 44