Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

C# e la Framework Class Library

1,938 views

Published on

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

Published in: Education, Business
  • Be the first to comment

C# e la Framework Class Library

  1. 1. www.manuelscapolan.it LEZIONE 03
  2. 2. .NET Framework Class Library 2 Exception Handling Collections Generics File I/O … and much more!
  3. 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. 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. 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. 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. 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. 8. • Voglio che sia bello, ricco e famoso! BitArray: un esempio 8
  9. 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. 10. • Definire un enumeratore personalizzato: IEnumerable e IEnumerator 10
  11. 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. 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. 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. 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. 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. 16. • Verifica delle performance con aggiunta e accesso per indice: Verifichiamo le performance 16 ArrayList List<T>VS
  17. 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. 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. 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. 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. 21. • L’ereditarietà tra classi generiche non comprende automaticamente anche i tipi Ereditarietà con i generics 21
  22. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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

×