C# e la Framework Class Library

44
www.manuelscapolan.it LEZIONE 03

description

Alcuni elementi dalla FCL: generics, i\o su file, exception handling...

Transcript of C# e la Framework Class Library

Page 1: C# e la Framework Class Library

www.manuelscapolan.it

LEZIONE 03

Page 2: C# e la Framework Class Library

.NET Framework Class Library

2

Exception Handling

Collections

Generics

File I/O

… and much more!

Page 3: C# e la Framework Class Library

• 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

Page 4: C# e la Framework Class Library

• 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).

Page 5: C# e la Framework Class Library

• Rappresenta un insieme di coppie

chiave/valore organizzate in base al codice

hash della chiave

Hashtable

5

Coppia chiave/valore elemento di una hashtable

Page 6: C# e la Framework Class Library

• 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

pushpop

enqueue dequeue

Page 7: C# e la Framework Class Library

• 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!

Page 8: C# e la Framework Class Library

• Voglio che sia bello, ricco e famoso!

BitArray: un esempio

8

Page 9: C# e la Framework Class Library

• 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

Page 10: C# e la Framework Class Library

• Definire un enumeratore personalizzato:

IEnumerable e IEnumerator

10

Page 11: C# e la Framework Class Library

• 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)

Page 12: C# e la Framework Class Library

• 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 …

Page 13: C# e la Framework Class Library

• 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

Page 14: C# e la Framework Class Library

• 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?

Page 15: C# e la Framework Class Library

• L’utilizzo dei generics porta ad avere i

seguenti benefici:

– Incapsulamento dell’algoritmoSeparo la logica dai dati nascondendo l’algoritmo

all’utilizzatore

– Verifica a compile-time sui tipiIl compilatore previene cast non validi

– Codice più pulitoNon devo fare cast o istanziare variabili intermedie

– Migliori performanceCon i value type non ho bisogno di fare boxing/unboxing

Benefici dei generics

15

Page 16: C# e la Framework Class Library

• Verifica delle performance con aggiunta e

accesso per indice:

Verifichiamo le performance

16

ArrayList List<T>VS

Page 17: C# e la Framework Class Library

• 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

Page 18: C# e la Framework Class Library

• 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:

Page 19: C# e la Framework Class Library

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

Page 20: C# e la Framework Class Library

• 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

Page 21: C# e la Framework Class Library

• L’ereditarietà tra classi generiche non

comprende automaticamente anche i tipi

Ereditarietà con i generics

21

Page 22: C# e la Framework Class Library

• 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

Page 23: C# e la Framework Class Library

• 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

Page 24: C# e la Framework Class Library

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

Page 25: C# e la Framework Class Library

• 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

Page 26: C# e la Framework Class Library

• 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

Page 27: C# e la Framework Class Library

• 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

Page 28: C# e la Framework Class Library

• 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

Page 29: C# e la Framework Class Library

• 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

Page 30: C# e la Framework Class Library

• 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

Page 31: C# e la Framework Class Library

• 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

Page 32: C# e la Framework Class Library

• 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

Page 33: C# e la Framework Class Library

• 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

BinaryReaderBinaryWriter

These classes allow you to store and retrieve primitive data types (integers, Booleans, strings, and whatnot) as a binary value.

BufferedStreamThis class provides temporary storage for a stream of bytes that you cancommit 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, whilethe DirectoryInfo from a valid object reference.

DriveInfo This class provides detailed information regarding the drives

FileFileInfo

You use these classes to manipulate a machine’s set of files. The Filetype exposes functionality using static members, while the FileInfotype exposes similar functionality from a valid object reference.

Page 34: C# e la Framework Class Library

System.IO: lavorare con i file

34

Tipo Descrizione

FileStreamThis class gives you random file access (e.g., seeking capabilities) withdata represented as a stream of bytes.

FileSystemWatcherThis class allows you to monitor the modification of external files in aspecified directory.

MemoryStreamThis class provides random access to streamed data stored in memoryrather than a physical file.

PathThis class performs operations on System.String types that contain fileor directory path information in a platform-neutral manner.

StreamWriterStreamReader

You use these classes to store (and retrieve) textual information to (orfrom) a file. These types do not support random file access.

StringWriterStringReader

Like the StreamReader/StreamWriter classes, these classes also workwith textual information. However, the underlying storage is a stringbuffer rather than a physical file.

• Tra le altre classi troviamo le classi astratte

Stream, TextReader e TextWriter

Page 35: C# e la Framework Class Library

• 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

Page 36: C# e la Framework Class Library

• 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 WriteAllLinesse non esiste il file viene creato in quel momento

Page 37: C# e la Framework Class Library

• 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

CanReadCanWriteCanSeek

Close() Flush()LengthSetLength()

Seek() PositionRead()ReadByte()

Write()WriteByte()

Page 38: C# e la Framework Class Library

• 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

Page 39: C# e la Framework Class Library

• 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

NewLineThis 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 (\r\n)

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

Page 40: C# e la Framework Class Library

• 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:

Page 41: C# e la Framework Class Library

• 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 StreamReaderspecificando il percorso del file da leggere

Page 42: C# e la Framework Class Library

• 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

Page 43: C# e la Framework Class Library

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

Page 44: C# e la Framework Class Library

Slide 2 : http://www.flickr.com/photos/ajc1/4663140532

CreditsLe immagini contenute in questa presentazione

hanno licenza Creative Commons

Contacts MANUEL SCAPOLAN

website: www.manuelscapolan.it

twitter: manuelscapolane-mail: [email protected]

44