Dot net framework 2

155

Click here to load reader

description

Dot net framework 2 overview

Transcript of Dot net framework 2

  • 1. Microsoft .Net Framework DotNet FRAMEWORK Architettura e DettagliIng. Felice [email protected]

2. Quale versione del Framework.NET?Questo corso sar incentrato sulla versione 2 del dotNetFramework,nonostante sia stata rilasciata in versione definitiva la 3 esia quasi pronta la 3.5.Ci perch la versione 3 non modifica, sostanzialmente, larchitetturadella versione 2, ma aggiunge uno strato superiore con funzionalitspecifiche. Inoltre la maggior parte del software attualmente sviluppato,la maggior parte del materiale didattico, cos come le CertificazioniMicrosoft (MCTS e MCPD) si basano proprio sulla versione 2.Anche se non esplicitamente evidenziato tutto quanto presentato diseguito sar comunque riferito alla versione 2.A conclusione del corso verr dedicato uno spazio proprio per presentarele novit del dotNet 3.5, la cui uscita prevista per gli inizi del 2008. 3. Certificazioni Microsoft: i percorsiApplication DevelopmentFoundation Esame 70-536 DistribuitedWindows BasedWeb Based ClientApplicatinClient DevelopmentDevelopment Development Esame 70-526Esame 70-528 Esame 70-529Design e Developing Design e Developing Design e DevelopingWindows Based Web BasedEnterpriseApplication Application Application Esame 70-548Esame 70-547Esame 70-549 4. Certificazioni Microsoft: testi ufficiali 5. Certificazioni Microsoft: SQL ServerEsame 70-431 6. Certificazioni Microsoft: Compendi Consigliati Serie Passo-Passo, di base Serie ProgrammingAutori: msdn2.microsoft.com/it-it/library/default.aspx Francesco Balena www.ugidotnet.orgDino Esposito www.aspitalia.comMarco Bellinaso www.dotnet2themax.it David Sheppa 7. Architettura del dotNet FrameworkCONCETTI INTRODUTTIVI 8. Cos il dotNet Framework Il Framework .NET e la piattaforma di sviluppo di riferimento per il mondo Windows, grazie alla quale e possibile realizzare soluzioni software a 360 in grado di rispondere alle esigenze pi complesse.I Punti di forza sono da ricercarsi nella sconfinata libreria di base, in un architettura a strati che permette una evoluzione natura (.Net 3/3.5), nellindipendenza dal linguaggio di programmazione e nella disponibilit del pi evoluto ambiente di sviluppo attualmente esistente (Visual Studio) 9. Il dotNET Framework dotNet presenta unarchitettura a strati. Al suo interno possiamo distinguere gli elementi portanti dellintero framework: CLR - Common Language Runtime BCL - Base Class Library ADO.NET & XML Windows Forms ASP.Net, Web Forms & Web Services CLS Common Language Specification CTS Common Type System 10. Il dotNET Framework: il CLR (1) Il COMMON LANGUAGE RUNTIME (CLR) uno strato posto al di sopra dei servizi del sistema operativo. Esso responsabile dellesecuzione vera e propria delle applicazioni: assicura che vengano rispettate tutte le dipendenze, gestisce la memoria, la sicurezza, lintegrazione del linguaggio e cos via. Il runtime fornisce numerosi servizi che consentono di semplificare la stesura del codice, la distribuzione dellapplicazione e di migliorare laffidabilit della stessa. 11. Il .NET Framework: il CLR (2) Con il CLR, Microsoft ha posto alcuni obiettivi cardine della propria tecnologia: Semplificare lo sviluppo Definire standard per il riuso del codice Fornire servizi come gestione della memoria e garbage collection Semplificare deployment delle applicazioni I componenti usano i metadati anzich la registrazione Supportare pi versioni Deployement da riga di comando XCOPY e disinstallazione DEL Eliminare luso del registro per i componenti e la necessit di codice extra per la loro gestione. Supportare i linguaggi di sviluppo Fornendo classi di base per gli strumenti e i linguaggi degli sviluppatori Supportare pi linguaggi di programmazione Definire i CTS utilizzati da tutti i linguaggi .NET 12. Il dotNET Framework: il CLR (3) Volendo fare un paragone con il mondo JAVA, il CLR lequivalente .NET della Java Virtual Machine (JVM): attiva gli oggetti, li sottopone a controlli di sicurezza, li dispone in memoria. Gli eseguibili .NET sono composti da Codice e Metadati. Questi ultimi contengono la definizione di tipo, informazione sulla versione e riferimenti ad Assembly esterni. Il Class Loader utilizza i metadati per il caricamento delle classi .NET, mentre i compilatori Just in Time (JIT) li utilizzano per compilare l Intermediate Language (IL) 13. Il dotNET Framework: il CLR (4) Tutti i linguaggi .NET, attraverso il CLR, accedono al medesimo sistema di tipi e alle stesse classi base, ottenendo cosi una convergenza tra Linguaggi e Modelli di Programmazione Il codice eseguito dal CLR viene detto CODICE GESTITO (MANAGED CODE) ed memorizzato come Codice+Metadati in un formato standard Windows PE (portable executable) che consente di: Leggere i metadati Fornire lo stack del codice Gestire le eccezioni Recuperare informazioni di sicurezza Esistono versioni del CLR anche sotto Linux e Mac Os X (vedi MONO) che consentono di eseguire il codice in formato PE anche in macchine non Windows rendendo .NET un framework multipiattaforma 14. Il dotNET Framework: la BCL La Base Class Library (BCL) linsieme delle librerie funzionali comuni ad ogni linguaggio basato sulla piattaforma dotNet, e comprende: Tipi dato complessi (collezioni), Networking, Accesso al file system, Interfaccia utente, Sicurezza,Programmazione concorrente, XML e molto altro Difatti, prima del dotNet Framework, gli Ingegneri del Software dovevano pianificare la realizzazione di una applicazione scegliendo preventivamente il linguaggio e di conseguenza si limitavano le librerie in base a quelle supportate dallo stesso. La BCL permette invece di scegliere, teoricamente anche in fase di sviluppo, il linguaggio pi opportuno per il task da eseguire, permettendone una sostanziale interoperabilit, al patto di rispettare le specifiche minime necessarie. 15. Il dotNET Framework: ADO.NET Praticamente tutte le applicazioni hanno la necessit di interrogare o aggiornare dati persistenti memorizzati in file piatti, database relazionali o altri tipi di supporto di memorizzazione. Per ovviare a tale necessit, il .NET Framework include ADO.NET, un sottosistema per laccesso ai dati ottimizzato per ambienti N-tier ed interoperabile con lXML ed i documenti XML. ADO.NET stato progettato per gli ambienti debolmente accoppiati e per fornire servizi per laccesso ai dati ad applicazioni scalabili e servizi basati sul Web. ADO.NET mette a disposizione API ad elevate Prestazioni per modelli di dati sia connessi sia Disconnessi particolarmente adatti alla restituzione di dati alle applicazioni Web. 16. Il dotNET Framework: XML XML svolge un ruolo fondamentale in nel .NET framework, sin dalla sua prima versione, essendo utilizzato per descrivere la applicazioni (metadati) in modo analogo ai deployment descriptor di Java. Inoltre spesso la base di comunicazione per lo scambio dei dati tra due applicazioni (marshaling e serializzazione) 17. Il dotNET Framework: ASP.NET ASP.NET fornisce un modello applicativo sotto forma di CONTROLLI che semplifica la creazione di applicazioni Web. Linfrastruttura include un insieme di Controlli Lato Server che ricalcano gli oggetti Widget delle tipiche interfacce utente HTML (tra cui, caselle di riepilogo, caselle di testo e pulsanti), ed un insieme aggiuntivo di Controlli Web Evoluti (come calendari e rotator). Essi sono posizionati attraverso drag&drop sulle pagine, indicate in gergo Web Form. I controlli vengono eseguiti in realt sul server Web ed inviano la propria interfaccia utente ad un browser sotto forma di HTML. Sul server, i controlli espongono un modello di programmazione orientato alloggetto che mette a disposizione degli sviluppatori Web tutta la ricchezza di questo tipo di programmazione. 18. Il dotNET Framework: WindowsForms Le WindowsForms sono praticamente le classiche finestre di unapplicazione windows che contengono i classici elementi come bottoni,combobox, aree di testo ecc. Tutti i controlli posizionati su una WindowsForm (e la WindowsForm stessa, che ugualmente un controllo) risponde ad una serie di eventi che lo sviluppatore pu gestire attraverso limplementazione di appositi Handler. 19. Il dotNET Framework: ASP.NET - WebForms Le WebForms sono lequivalente delle WindowsForms, eccetto che il loro ambiente di esecuzione il Browser Web. Esse vengono elaborate sul server e successivamente passate al browser nel classico formato HTML La fase di implementazione di una WebForm non si discosta molta da quella di una classica WindowsForm. 20. Il dotNET Framework: ASP.NET XML Web ServicesI Web Services sono una sorta di piccoliservizi disponibili in rete, che fornisconofunzionalit specializzate. Essi vengonointerrogati attraverso il protocollo SOAPbasato su XML. 21. Il dotNET Framework: CTS Il COMMON TYPE SYSTEM (CTS) definisce un insieme standard di tipi di dato e di regole necessarie per la realizzazione di nuovi tipi, consentendo ai vari linguaggi di interoperare correttamente tra loro CTS fornisce due tipi principali entrambi ereditati da System.Object: Tipi a Valore, utili per rappresentare tipi di dati semplici e quelli definiti dallutente (ovvero le strutture); Tipi a Riferimento, ovvero: tipi di oggetti, tipi di interfacce e tipi di puntatori Da notare che in .NET tutti i tipi sono orientati agli oggetti (ogni elemento un oggetto) e i tipi a valore possono essere convertiti in tipi a riferimento mediante il boxing CTS definisce, inoltre, un modello uniforme per la gestione delle eccezioni, indipendentemente dal linguaggio utilizzato (ovviamente con sintassi diverse). Si tratta in praticamente di definire i seguenti passi: Lanciare uneccezione Catturare uneccezione Codice di uscita da un blocco controllato (finally) 22. Il dotNET Framework: CTS, Tipi a Valore I Tipi a Valore non possono essere null (tranne i NULLABLE che sono un discorso a parte) e devono sempre contenere dei dati. Possono essere: : primitivi, strutture e enumerazioni; Per creare un tipo a valore personalizzato anche derivandolo da una classe System.ValueType, proprio come fa dotNet per i tipi primitivi. Prendendo ad esempio il tipo int, si vede che esso non nientaltro che un alias di System.Int32 derivato apputno da Sysem.ValueType. E utile sottolineare che il passaggio di un Tipo a Valore in una funzione avviene per copia 23. Il dotNET Framework: CTS, Tipi a Riferimento I Tipi a Riferimento rappresentano il riferimento ad oggetti allocati nellHeap (a differenza dei tipi a valore allocati sullo Stack), ed ammettono il valore Null. Il passaggio a funzioni avviene per riferimento, cio viene passato un indirizzo o un puntatore ad un oggetto. Questi tipi vengono gestiti dal CLR e sottoposti a GARBAGE COLLECTION.CTS promuove la sicurezza di tipi in modo damigliorare la stabilit del codice, attraversodefinizioni dei tipi completamente note eche non possono essere alterate.Ci si traduce nel fatto che i riferimenti aglioggetti siano strongly-typed,ovvero durantela fase di assegnanzione di un oggetto ad unreference viene verificato se sono di tipocompatibile. 24. Il dotNET Framework: CLS Le COMMON LANGUAGE SPECIFICATION, definiscono le regole che un linguaggio deve avere per essere gestito dal framework, permettendo linteroperabilit tra i vari linguaggi supportati dal dotNet Framewor. In pratica descrivo come il compilatore deve trasformare il codice sorgente nel codice intermedio (Itermediate Language IL), per essere compatibile con le specifiche del framework. Il CLS, inoltre, definisce le API dei componenti .NET 25. Esecuzione di applicazioni dotNETCompilazione ed Esecuzione di codice dotNET 26. Compilazione e Generazione dellAssembly Source code AssemblyCompilatore es: Csc.exe o Vbc.exeC++, C#, Visual DLL o EXEBasic o altrilinguaggi .NET Lapplicativo, scritto in uno dei linguaggi supportati, viene compilato, generando cosun ASSEMBLY, che nonostante lestensione, un packaging composto da pi elementi. 27. Assembly dotNet Un ASSEMBLY rappresenta il costituente fondamentale di unapplicazione .NET. Si tratta dellunit elementare di rilascio del codice e di gestione delle versioni, ed composto da:Un manifesto (Manifest);Un insieme di uno o pi moduli (dll o exe);Un insieme opzionale di risorse Tutti i tipi e le risorse gestiti sono contrassegnati in uno dei seguenti modi: accessibili solo allinterno della propria unit implementativa esportabili per essere utilizzati dal codice al di fuori di tale unit. 28. Assembly Manifest: Descrizione Gli assembly si autodescrivono tramite il proprio MANIFEST (manifesto), che costituisce una parte integrante di ogni assembly stesso: Stabilisce lidentit dellassembly in Type Descriptionstermini di nome, versione, livello di Classescondivisione tra applicazioni diverse, Base classes firma digitale. Implemented interfaces Definisce quali file (nome e file hash) Data members costituiscono limplementazione Methodsdellassembly.Specifica le dipendenze in fase di Assembly Manifestcompilazione da altri assembly. Name Specifica i tipi e le risorse che Versioncostituiscono lassembly, inclusi quelli Cultureche vengono esportati dallassembly. Other assemblies Specifica linsieme dei permessi Security permissions necessari al corretto funzionamento Exported types dellassembly. 29. Assembly Manifest: Uso dei MetadatiI METADATI sono indipendenti dal linguaggio, consentendo a quelli che vi accedonodi interpretarli in modo univoco.Questo permette di creare progetti (assistiti da IDE come Visual Studio) checontengono al loro interno codice sorgente di linguaggi diversi, proprio grazie alleinformazioni contenute nei metadati dei componenti;Il compilatore genera i metadati di un componente dal codice sorgente chevengono memorizzati nel codice compilato in un formato PE (Portable Executable);Un tools per la visualizzazione dei metadati ildasm.exe 30. Assembly: Execution Model, Intermediate LanguageCome detto il Codice Sorgente viene compilato nel linguaggio intermedio IL,spesso indicato anche come MSIL (Microsoft IL) e CIL (Common IL).Vediamo un esempio di IL: .method private hidebysig static void Main() cil managed { .entrypoint // Code size 11 (0xb) .maxstack 8 IL_0000: ldstr "Hello, world!" IL_0005: callvoid [mscorlib]System.Console::WriteLine(string) IL_000a: ret } // end of method HelloWorld::Main 31. Assembly: Execution Model Gli assemblies sono caricati in memoria dal CLR solo alloccorrenza: prima viene determinata la versione poi viene cercato lassembly nella Global Assembly Cache (GAC) oppure nelpercorso locale indicato dal codice base; Prima dellesecuzione il CLR deve procedere alla compilazione dell IL (non eseguibile direttamente dal processore) per la generazione di codice nativo. Ci sono due possibilit: Compilazione del Metodo a Tempo di Esecuzione, Just In Time (JIT); Compilazione di tutto lAssembly prima dellesecuzione Come gi accennato in precedenza, il CLR permette di limitare le funzionalit del codice eseguito. 32. Assembly: Execution Model SchemaCompilazione AssemblySource Language Code(.exe o .dll) CodeCompiler MSIL Metadata Compilazione Just in TimeEsecuzione Native JIT Code Compiler 33. Assembly: Deployment semplificato Sicuramente il Deployment rappresenta uno dei grossi vantaggi di dotNet,permettendo: Uninstallazione senza effetti collaterali (dll Hell), le applicazioni e icomponenti possono sempre essere condivisi o privati; Lesecuzione Side-by-Side, diverse versioni dello stesso componentepossono coesistere, anche nello stesso processo Il Deployment pu avvenire in modi diversi: XCOPY, per le applicazioniASP.NET .CAB, per le applicazioniWindows Forms - Code Download .MSI (Windows Installer), per le Applicazioni Windows Forms l installazione in GAC di assembly condivisi, la Configurazione di shortcut 34. Assembly Location Avendo parlato di deployment utile specificare le location che gli assembly possono assumere in base alla loro tipologia: Assembly privati, directory applicazione (e sub-directory) Assembly condivisi, Global Assembly Cache (GAC) (c:windowsassembly) Assembly scaricati da URL, download cache(c:Documents and Settings%USERNAME% Local SettingsApplication Dataassemblydl2) Il Tool per esaminare GAC e download cache GACUTIL.EXE 35. Garbage Collection (1) Durante lesecuzione del codice gli oggetti non pi utilizzati come vengono deallocati dalla memoria? dotNet distrugge automaticamente gli oggetti quando non sono pi referenziati, utilizzando un sofisticato algoritmo di Mark-and-Compact Fase 1: MarkNextObjPtr Root set Oggetti vivi Oggetti non raggiungibili Spazio libero 36. Garbage Collection (2) Fase 2: CompactSpazio recuperatoNextObjPtrRoot setOggetti viviSpazio libero www.devleap.it 37. Garbage Collection (3)Non sempre ci si pu affidare in modo cieco al Garbage Collecto, ma in alcunicasi serve un comportamento di finalizzazione deterministica. In particolarequando si hanno: Riferimenti a oggetti non gestiti Utilizzo di risorse che devono essere rilasciate appena termina il loro utilizzoNon si possono usare i finalizzatori (come si fa in C++), che sono richiamabilidirettamente, ma bisogna utilizzare linterfaccia IDisposable, implementandoil metodo Dispose. 38. Linguaggi del dotNet Framework Come pi volte ribadito fin ora , il dotNet Framework LANGUAGE- INDEPENDED, ovvero non dipende dal linguaggio scelto. Microsoft fornisce direttamente il supporto (ed il compilatore) per:C++, C#, J#, VB 2005, Jscript Esistono, comunque, implementazione di terze parti che spesso permettono di portare sulla piattaforma dotNet linguaggi molto utilizzati:Perl, Ruby, Python, Pascal, APL, COBOL, Eiffel, Haskell, ML, Oberon,Scheme, Smalltalk Chiunque, rispettando le CLS pu realizzare (in teoria) il proprio linguaggio dotNet Ready 39. Base Class ed Interfacce Le Classi e le Interfacce della BCL 40. Base Class ed Interfacce: Namespaces Web ServicesUser Interface DataXml Base Class Library 41. Base Class ed Interfacce: NamespacesSystem.Web System.Windows.FormsUIDesign ComponentModel Compilation HtmlControlsHandlers WebControls Hosting System.DrawingCachingSecurityDrawing2DPrintingConfigurationSessionState Imaging TextSystem.DataSystem.XmlOleDbCommonXslSchemaSqlClientSQLTypesXPathSerializationSystem CollectionsIOSecurityRuntimeConfigurationReflectionText InteropServices Diagnostics Resources ThreadingRemoting Globalization Serialization 42. Base Class ed Interfacce: Namespaces System CollectionsSecurityConfiguration Text Diagnostics Threading Globalization RuntimeIO InteropServicesReflection RemotingResources Serialization 43. Base Class ed Interfacce: NamespacesSystem.DataCommonOleDb Sql/SqlClientOracleClientOdbc MessagingSystem.Xml SchemaXsl SerializationXPath 44. dotNet Framework: Namespaces System.Web ManagementUI Compilation HtmlControlsHandlers WebControlsHostingCaching SecurityConfigurationSessionState ProfileServices 45. dotNet Framework: NamespacesSystem.Windows.Forms Design ComponentModelVisualStylesSystem.DrawingDrawing Printing Design Text 46. Input / Output Input e Output con dotNet 47. dotNet Framework: Input / Output Una delle principali attivit che ci si trova a realizzare linterazione con il (i) file system. dotNet mette a disposizione un insieme di classi raccolte nel NameSpace System.IO, che permettono di effettuare operazioni di vario genere su file, directory,ecc: FILEINFO and DIRECTORYINFO (base class: FileSystemInfo), permettono di interrogare ogni elemento del file system per ottenerne informazioni di vario genere DRIVEINFO, permette di ottenere informazione sulle periferiche di I/O FILE, DIRECTORY, PATH sono le utility class che permettono, attraverso metodi statici, di effettuare varie operazioni sui corrispettivi elementi 48. dotNet Framework: I/O, ottenere informazioni dal File SystemOttenere informazione su un file FileInfo ourFile = new FileInfo(@"c:boot.ini ");if (ourFile.Exists){Console.WriteLine("Filename : {0}", ourFile.Name);Console.WriteLine("Path : {0}", ourFile.FullName);} Copiare un fileEnumerare I file in una directoryFileInfo ourFile = newDirectoryInfo ourDir = newFileInfo(@"c:boot.ini"); DirectoryInfo(@"c:windows");ourFile.CopyTo(@"c:boot.bak"); Console.WriteLine("Directory: {0}",ourDir.FullName);foreach (FileInfo file in ourDir.GetFiles()){ Console.WriteLine("File: {0}",file.Name);} 49. dotNet Framework: Gli StreamPer effettuare le operazioni di lettura e scrittura, il.Net Framework fornisce gliSTREAM (letteralmente flussi), che permettono un accesso sequenziale erandom ai dati.La classe base (di tipo astratta) Stream,che fornisce una serie di funzionalitcomuni a tutti gli stream specializzati.Tra gli Stream Personalizzati:FileStream, specializzato nelle operazioni di lettura/scrittura dei fileMemory Stream, crea un flusso in memoria (utili per operazionitemporanee)Buffered Stream, crea un wrapper per lo stream specifico allo scopo dimigliorarne le performance;StreamReader (base class: TextReader), consente operazioni di lettura sustream genericiStreamWriter (base class: TextWriter), consente operazioni di scrittura sustream generici 50. dotNet Framework: aprire uno Stream su fileLapertura degli Stream, relativi alla lettura/scrittura file, avviene attraverso unaserie di classi statiche ed enumeratori presenti nel Namespace System.IO: File, fornisce le funzionalit di base per leggere e scrivere da file; Directory, per effettuare operazioni sulle directory FileAccess Enumeration, che specifica i diritti (Read, Write, ReadWrite) da applicare allapertura di un file; FileMode Enumeration specifica i diritti sui file che si andranno ad aprire.Aprire un file per la lettura File.Open(@"C:boot.ini", FileMode.Open, FileAccess.Read);Creare un file File.Create(@"c:somefile.txt"); 51. dotNet Framework: Leggere/Scrivere da un file Leggere da fileFileStream theFile = File.Open(@"C:boot.ini", FileMode.Open, FileAccess.Read);StreamReader rdr = new StreamReader(theFile);Console.Write(rdr.ReadToEnd());rdr.Close();theFile.Close();StreamReader rdr = File.OpenText(@"C:boot.ini");Console.Write(rdr.ReadToEnd());rdr.Close(); Scrivere su fileFileStream theFile = File.Create(@"c:somefile.txt");StreamWriter writer = new StreamWriter(theFile);writer.WriteLine("Hello");writer.Close();theFile.Close();File.WriteAllText(@"c:somefile.txt", "Hello"); 52. dotNet Framework: Usare il MemoryStream Scrittura su uno Stream in Memoria e successivo riversamento su file MemoryStream memStrm = new MemoryStream(); StreamWriter writer = new StreamWriter(memStrm); writer.WriteLine("Hello"); writer.WriteLine("Goodbye"); writer.Flush(); FileStream theFile = File.Create(@"c:inmemory.txt"); memStrm.WriteTo(theFile); writer.Close(); theFile.Close(); memStrm.Close(); 53. dotNet Framework: Stream Speciali Oltre agli stream che permetto una normale lettura/scrittura da file o memoria, esistono una speciale categoria di stream definiti Compression Stream Attualmente sono disponibili due Compression Stream:GZipStream, che permette la compressione compatibile con lo standard de-facto zip;DeflateStream, che crea una compressione proprietaria. In realt entrambi gli stream usano lo stesso algoritmo per la compressione. La differenza sta nel fatto che la compatibilit con lo standard zip richiede un header apposito e quindi un ulteriore (anche se lieve) aggravio di risorse. Una sostanziale differenza con gli stream classici, come vedremo dagli esempi, che i compression stream scrivono i dati su stream di appoggio (file, memoria). Infine, da precisare, che entrambi i compression stream possono gestire al massimo 4Gb di dati. Lesempio che segue mostra la compressione/decompressione con la classe GZipStream. Per utilizzare il DelfateStream basta sostituire listruzione di creazione delloggetto 54. dotNet Framework: Comprimere/Decomprimere con gli stream FileStream sourceFile = File.OpenRead(inFilename); FileStream destFile = File.Create(outFilename); GZipStream compStream = new GZipStream(destFile, CompressionMode.Compress); int theByte = sourceFile.ReadByte(); while (theByte != -1) {compStream.WriteByte((byte)theByte);theByte = sourceFile.ReadByte(); }Compressione FileStream sourceFile = File.OpenRead(inFilename); FileStream destFile = File.Create(outFilename); GZipStream compStream = new GZipStream(sourceFile, CompressionMode.Decompress); int theByte = compStream.ReadByte(); while (theByte != -1) { destFile.WriteByte((byte)theByte); theByte = compStream.ReadByte(); Decompressione } 55. dotNet Framework: Working with Text Lavorare con le Stringhe ed il Testo 56. dotNet Framework: Working with Text Lavorare con le stringhe di testo un task comune per tuttigli sviluppatori .Net mette a disposizione un insieme di classi raccolte nelNameSpace System.Text, che permettono di effettuareoperazioni di vario genere sulle stringhe: StringBuilder, permette una manipolazione efficiente delle stringhe; Regex, Match, Group, permettono lelaborazione delle stringhe attraverso le Espressioni Regolari; Encode/Decode, sono specializzate nella codifica/decofica delle stringhe nei vari formati internazionali. 57. dotNet Framework: La classe StringBuilder e la classe String Normalmente si portati ad utilizzare la classe String per le operazioni sulle stringhe. In realt un oggetto di tipo String un oggetto atipico, perch ogni operazione su di esso (tipo laggiunta di nuovi caratteri alla stringa), non modifica loggetto esistente, bens ne crea uno nuovo aggiornando il reference. Per migliorare le performance (ed evitare inutili sprechi di memoria) il .Net framework prevede la classe StringBuilder, che crea un oggetto stringa dinamicoSystem.Text.StringBuilder sb = new System.Text.StringBuilder(30);sb.Append("wombat");sb.Append(" kangaroo");sb.Append(" wallaby");sb.Append(" koala");string s = sb.ToString();Console.WriteLine(s); 58. dotNet Framework: Regular Expression Le Espressioni Regolari (Regular Expression) sono una eredit del mondo Unixe del linguaggio PERL. Rappresentano un modo efficiente per effettuare elaborazioni complesse sullestringhe di testo. Come esempio, la seguente Regular Expression, permette divalidare un indirizzo email: ^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$ Nella pratica lutilizzo di Espressioni Regolari pu risultare anche moltocomplesso e non approfondiremo uteriormente largomento.Comunque il modo pi semplice per verificare se una stringa supera la verificarispetto ad una Espressione Regolare (MATCH) quello di usare la classe Regexe il metodo statico IsMatch: Regex.IsMatch("pattern", @"ApatternZ") 59. dotNet Framework: Codifica del Testo Vista leterogeneit dei sistemi informatici esistenti, non meraviglia che esistanodiversi modi di codificare (o meglio, rappresentare) le stringhe. La codifica pi utilizzata nello scorso decennio stata quella ASCII (7bit), ormaiinsufficiente per codificare adeguatamente anche caratteri speciali (come lelettere degli alfabeti orientali).Oggi la codifica pi utilizzata la Unicode UTF-16 (16 bit), che anche lacodifica base utilizzata dal framework .Net.Nel caso si renda necessario lavorare con codifiche differenti, possibileutilizzare le classi Encode/Decode come mostrato dallesempio seguente: // Get Korean encoding Encoding e = Encoding.GetEncoding("Korean"); // Convert ASCII bytes to Korean encoding byte[] encoded; encoded = e.GetBytes("Hello, world!"); // Display the byte codes for (int i = 0; i < encoded.Length; i++) Console.WriteLine("Byte {0}: {1}", i, encoded[i]); 60. dotNet Framework: Collection & Generics Lavorare su insiemi di oggetti 61. dotNet Framework: Collection & GenericsOgni framework che si rispetti deve avere unampia serie di collezioni (collection)che permettono di gestire un insieme di oggetti, pi o meno omogeneei,attraverso i classici costrutti dei moderni linguaggi.dotNet contempla al suo interno limplementazione delle COLLECTIONCLASSICHE e dei GENERICSLa differenza sostanziale tra le due che le Collection Classiche memorizzano alloro interno gli oggetti attraverso il casting, mentre nel caso dei Generics lacategoria di oggetti contenuti nella collection tipizzata.Le Generics portano in dote vantaggi di performance (molto limitati in realt), masoprattutto una programmazione type-safe, in cui il compilatore a verificare ilcorretto utilizzo della collezzione. 62. dotNet Framework: Collection ClassicheLe Collection Classiche sono contenute nel NameSpace System.Collections eannoverano:ArrayList, una semplice collezione ridimensionabile ed indicizzata;SortedList, una collezione ordinata composta da coppie nome/valore;Queue, la classica coda; struttura FIFO (first in first out);Stack, ovvero last in last out, LIFO;Hashtable, una collezione nome/valore;BitArray, una collezione compatta di valorie Boolean;StringCollection, collezione specializzata per le stringhe;StringDictionay, ovvero una hashtable specializzata per le stringhe;ListDictionary, una collezione nome/valore ottimizzata per piccole quantitdi dati;HybridDictionary, una collezione nome/valore ibrida. Per piccole quantit didati si comporta come una ListDictionary, altrimenti come una Hashtable La System.Collctions prevede tre interfacce di base: IEnumerable (rende enumerabile la lista), ICollection (rende omogenee le funzionalit di base), IList (estende le funzionalit di base comuni). 63. dotNet Framework: Collection Classiche La System.Collctions prevede tre interfacce di base: IEnumerable (rende enumerabile la lista), ICollection (rende omogenee le funzionalit di base), IList (estende le funzionalit di base comuni). Grazie a queste tre interfaccie possibile operare uniformemente sulle varie Collection Classiche, attraverso i classici metodi: insert, remove, add, e cos via.Nota a parte merita la possibilit di effettuare lordinamento (collection.Sort) di unaCollezione. Infatti lordinamento varia in base al tipo di oggetto inserito nellacollezione Per questo possibile definire un propria classe di ordinamento (chedeve implementare linterfaccia IComparer) e della quale unistanza pu esserepassata al metodo Sort: coll.Sort(new CaseInsensitiveComparer()); 64. dotNet Framework: Genericsclass Stack I generics sono stati introdotti { dalla versione 2 del frameworkprivate T[] store; private int size; e sono formati da classi e metodi che lavorano in modopublic Stack() { uniforme su tipi differenti store = new T[10]; Beneficisize = 0;} Le variabili sono di un tipo ben preciso e non Object public void Push(T x) { Non necessario un cast// push code goes here} (errori in fase di compilazione)public T Pop() { Riutilizzo reale del codice return store[--size];}}void Add(Stack s) { int x = s.Pop(); int y = s.Pop(); s.Push(x+y);} 65. dotNet Framework: GenericsTra le implementazioni si annoverano: List, ovvero una semplice lista di elementi; Queue, la coda (FIFO); Stack, lo stack (LIFO); Dictionary, collezione nome/valore; SortedList, lista di elementi ordinati; SortedDictionay , collezione nome/valore ordinata; NameValuePair, coppia nome/valore (in pratica ritornato dalliterazione suldictionary); LinkedList, lista linkata;Tra le interfacce troviamo:IListIDictionaryIEnumerableIComparable 66. dotNet Framework: Generics vs. Collection ClassicheNon-genericArrayList myList = new ArrayList();myList.Add(1);// Viene effettuato il boxing (value -> refernce)myList.Add(2);// Viene effettuato il boxing (value -> refernce)myList.Add(3");// Provocher un errore a runtimeint i = (int)myList[0];// Necessario effettuare il castGenericList myList = new List();myList.Add(1); // Nessun boxingmyList.Add(2); // Nessun boxing// myList.Add(3");// Errore a tempo di compilazioneint i = myList[0]; // Nessun casting richiesto 67. dotNet Framework: Generics vs. Collection Classiche Rappresentazione senza Generics Rappresentazione con Genericsobject int intobject int intobject int int object intobjectintBoxUnbox int intintintPush PopPush Pop 68. dotNet Framework: SerializationPersistere lo Stato di un Oggetto 69. dotNet Framework: SerializationLa Serializzazione permette di salvare un oggetto (e, quindi, il suo attuale stato)in modo persistente su un supporto di memorizzazione, ma anche di inviare lostesso oggetto attraverso le reti per un utilizzo remoto.Il dotNet Frameworok permette la serializzazione attraverso opportune classicontenute nel namespace System.Runtime.Serialization: BinayFormatter, permette di serializzare un oggetto in formato binario e trasferirlo su uno stream; SoapFormatter , permette di serializzare un oggetto in formato XML aderente allo standard SOAPe nel namespace System.Xml.SerializationXmlSerializer, permette di serializzare un oggetto in formato XML 70. dotNet Framework: SerializationIl dotNet framework utilizza un modo semplice ed immediato per rendereserializzabile un oggetto:[Serializable]class ShoppingCartItem{ Class ShoppingCartItempublic int productId;Public productId As Integerpublic decimal price;Public price As Decimal C# VB basta, in pratica, inserire lattributo [serializable] per rendere la classe serializzabile. La serializzazione comunque pu essere parziale, escludendo alcuni elementi, come di seguito mostrato:VB Public total As Decimal // C# [NonSerialized] public decimal total; 71. dotNet Framework: Serialization, IDeserializationCallback Nel caso in cui si abbiano dei membri (variabili di istanza) calcolati, si pu decidere di non serializzarne il valore (per risparmiare spazio), facendolo ricalcolare durante la serializzazione attraverso linterfaccia IDeserializationCallback ed il relativo metodo IDeserializationCallback.OnDeserialization [Serializable] class ShoppingCartItem : IDeserializationCallback { public int productId; public decimal price; public int quantity; [NonSerialized] public decimal total;public ShoppingCartItem(int _productID, decimal _price, int _quantity){productId = _productID;price = _price;quantity = _quantity; total = price * quantity;}void IDeserializationCallback.OnDeserialization(Object sender) {/ / After deserialization, calculate the totaltotal = price * quantity;} } 72. dotNet Framework: Binary SerializationCome detto, la serializzazione avviene mediante le classi prima descritte eriversando i dati ottenuti su uno stream. Vediamo alcuni esempi: string data = "This must be stored in a file."; FileStream fs = new FileStream("SerializedString.Data", FileMode.Create); BinaryFormatter bf = new BinaryFormatter(); // Use the BinaryFormatter object to serialize the data to the file bf.Serialize(fs, data); fs.Close();Serializzazione FileStream fs = new FileStream("SerializedString.Data", FileMode.Open); BinaryFormatter bf = new BinaryFormatter(); // Create the object to store the deserialized data string data = ""; data = (string) bf.Deserialize(fs); fs.Close();Deserializzazione Se si volesse utilizzare la serializzazione compatibile con lo standard SOAP, basta sostiture BinaryFormatter con SoapFormatter 73. dotNet Framework: XML Serialization Nel caso in cui si voglia rendere il risultato della serializzazione il pi portabile possibile, si pu ricorrere alla serializzazione XML. Loggetto da serializzare, in questo caso, deve seguire regole pi stringenti: la classe deve essere pubblica tutti i membri da serializzare devono essere pubblici deve esistere un costruttore senza parametri espressamente dichiarato// Create file to save the data toFileStream fs = new FileStream("SerializedDate.XML", FileMode.Create);// Create an XmlSerializer object to perform the serializationXmlSerializer xs = new XmlSerializer(typeof(DateTime));xs.Serialize(fs, System.DateTime.Now);fs.close();Serializzazione// Open file to read the data fromFileStream fs = new FileStream("SerializedDate.XML", FileMode.Open);// Create an XmlSerializer object to perform the deserializationXmlSerializer xs = new XmlSerializer(typeof(DateTime));DateTime previousTime = (DateTime)xs.Deserialize(fs);fs.close();Deserializzazione 74. dotNet Framework: Custom Serialization Se le precedenti forme di serializzazione non sono adeguate ai nostri scopi (caso molto raro) possiamo procedere a realizzare una serializzazione personalizzata. Ci si pu ottenere implementando lInterfaccia Iserializable (conseguentemente il metodo GetObjectData) ed applicando lattributo [serializable] alla classe.Tuttavia esiste un metodo pi immediato, ma ovviamente meno flessibile, percontrollare la serializzazione e quindi personalizzarla: i Serialization Events.Si tratta di eventi che si scatenano utilizzando il BinaryFormatter e sono: Serializing, scatenato prima di inizializzare la serializzazione; Serialized, scatenato dopo la serializzazione; Deserializing, scatenato prima della deserializzazione; Deserialized, scatenato dopo la deserializzazione; possibile catturare questi eventi, e gestirli nel modo pi opportuno, creando degliappositi metodi allinterno della classe da serializzare e applicandovi lattributocorrispondente allevento da catturare: [OnDeserialized] void CheckTotal(StreamingContext sc) { if (total == 0) { CalculateTotal(sc); } } 75. dotNet Framework: Graphics Grafica elementare 76. dotNet Framework: Graphics dotNet offre gli strumenti base per la creazione di semplici elementi grafici (linee, cerchi, ecc.), tutti contenuti nel namespace System.Drawing. Attraverso gli strumenti offerti possibile:Aggiungere forme allUI in modo dinamico;Creare diagrammi;Editare e ridimensionare immagini;Cambiare il grado di compressione di una immagine;Zoommare immagini;Aggiungere un logo di copyright o del testo ad una immagine. Tra le classi primarie di questo namespace troviamo: Bitmap, Brush, Font, Graphics, Icon, Image e Pen. Un ruolo importante rivestono inoltre le strutture di questo namespace (ad es. Color o Point), che permettono di impostare o modificare gli elementi del disegno. 77. dotNet Framework: Graphics Per disegnare una linea o una figura base, bisogna eseguire tre passi fondamentali: Creare un oggetto Graphics, partendo dalla form o dal controllo attuale, attraverso il metodo System.Windows.Forms.Control.CreateGraphics; Creare un oggetto Pen; Chiamare un metodo delloggetto Graphics per disegnare sul controllo usando loggetto Pen // Create a graphics object from the form Graphics g = this.CreateGraphics(); Graphics g = this.CreateGraphics(); Pen p = new Pen(Color.Blue, 3); // Create a pen object with which to draw g.DrawPie(p, 1, 1, 100, 100, -30, 60); Pen p = new Pen(Color.Red, 7); // Draw the line g.DrawLine(p, 1, 1, 100, 100); 78. dotNet Framework: Graphics Invece di utilizzare loggetto Pen, in abbinamento con il metodo graphics.drawXXX, possibile utilizzare un oggetto Brush (e il metodo graphics.fillXXX) per poter creare figure con riempimento.Graphics g = this.CreateGraphics();Brush b = new SolidBrush(Color.Maroon);Point[] points = new Point[]{new Point(10, 10),new Point(10, 100),new Point(50, 65),new Point(100, 100),new Point(85, 40)};g.FillPolygon(b, points); 79. dotNet Framework: GraphicsGrazie alle implementazioni della classe astratta System.Drawing.Image, possibile elaborare immagini esistenti o crearne di nuove. Questa classe astrattatrova nel framework due implementazione: System.Drawing.Bitmp, per le immagini; System.Drwaing.Imaging.Metafile, per le immagini animate;Nonostante Image sia una abastract class possibile utilizzare i metodiimplementati per ottenerne unistanza:Image i = Image.FromFile(@"C:windowsgone fishing.bmp");pictureBox1.BackgroundImage = i; Bitmap bm = new Bitmap(600, 600); Graphics g = Graphics.FromImage(bm); Se si vuole creare e salvare unaBrush b = new LinearGradientBrush(new Point(1, 1),new Point(600, 600), Color.White,Color.Red); nuova immagine si lavoro pressappocoPoint[] points = new Point[] come negli esempi precedenti,{new Point(10, 10), eccetto che la creazione new Point(77, 500),new Point(590, 100), delloggetto graphics avvienenew Point(250, 590), attraverso un metodo apposito: new Point(300, 410)}; g.FillPolygon(b, points); bm.Save("bm.jpg", ImageFormat.Jpeg); 80. dotNet Framework: Graphics Attraverso le funzionalit di System.Drawing possibile creare anche testo sotto forma di immagine, utile, ad esempio, se si desidera marchiare una foto con un proprio identificativo.Graphics g = this.CreateGraphics();Font f = new Font("Arial", 40, FontStyle.Bold);g.DrawString("Hello, World!", f, Brushes.Blue, 10, 10); Infine il namespace in esame prevedeunaclasse apposita per disegnare/visualizzare le icone di sistema: Graphics g = this.CreateGraphics(); g.DrawIcon(SystemIcons.Question, 40, 40); 81. dotNet Framework: Threading Esecuzione Concorrente di Attivit 82. dotNet Framework: Threading Grazie allutilizzo dei Thread possibile dotare lapplicazione di pi flussi paralleli che possono portare ad un sostanziale miglioramento prestazionale della stessa ed a una migliore interazione utente-applicazione. Il namespace di riferimento il System.Threading, che annovera la classe Thread e lenumerazione ThreadState. La creazione di un nuovo thread, effettuabile in qualsiasi parte del codice, avviene attraverso i seguenti passi:1. Creare un metodo senza parametri e senza argomenti di ritorno:static void SimpleWork(){Console.WriteLine("Thread: {0}",Thread.CurrentThread.ManagedThreadId);} 2. Creare un delegato ThredStart, specificando il metodo creato nel passo 1 3. Creare un nuovo oggetto Thread, specificando il treadstart creato al passo2 4. Chiamare il metodo Thred.Start per avviare il thread 83. dotNet Framework: Threading In sintesi ecco il codice per avviare un thread: ThreadStart operation = new ThreadStart(SimpleWork);ThreadStart operation = new ThreadStart(SimpleWork); for (int x = 1; x