C# 8 e Visual Studio 2019 Daniele Bochicchio, Cristian Civera, Marco Leoncini, Stefano Mostarda, Matteo Tumiati C# 8 e Visual Studio 2019 Guida completa per lo sviluppatore EDITORE ULRICO HOEPLI MILANO Copyright © Ulrico Hoepli Editore S.p.A. 2019 via Hoepli 5, 20121 Milano (Italy) tel. +39 02 864871 – fax +39 02 8052886 e-mail [email protected] www.hoepli.it Seguici su Twitter: @Hoepli_1870 Tutti i diritti sono riservati a norma di legge e a norma delle convenzioni internazionali ISBN EBOOK 978-88-203-8968-0 Progetto editoriale e realizzazione: Maurizio Vedovati - Servizi editoriali ([email protected]) Copertina: Sara Taglialegne Realizzazione digitale: Promedia, Torino Indice Contenuti del libro Gli autori ASPItalia.com Ringraziamenti Capitolo 1: Introduzione a .NET Cos’è .NET .NET = .NET Framework + .NET Core .NET Standard I componenti di .NET Common Language Runtime (CLR) Il concetto di codice managed Common Type System Common Language Specification La Cross-Language Interoperability Tipi di valore e tipi di riferimento Conversioni tra tipi, boxing e unboxing La gestione della memoria: il Garbage Collector Il concetto di Assembly Interoperabilità tra .NET e COM Analisi di .NET Core Scegliere .NET Core o .NET Framework .NET 5 e il futuro di .NET Conclusioni Capitolo 2: Visual Studio L’IDE di Visual Studio Text Editor, designer e Intellisense Toolbox Property Editor Altre aree dell’IDE Creare un progetto Il multi-targeting di .NET in Visual Studio Il concetto di progetto e soluzione Gestire soluzione e progetto Aggiungere un progetto alla soluzione Gestione delle referenze Gestione di directory nella solution Gestione del codice sorgente Compilare un progetto Gestire le configurazioni Debug di un progetto Usare il debugger Breakpoint e watch Intellitrace e historical debug Refactoring Novità di Visual Studio 2019 Supporto a editorConfig Conclusioni Capitolo 3: Introduzione al linguaggio e sintassi di base Introduzione al linguaggio Uso dei commenti Tipi di base Namespace Dichiarazione di variabili Espressioni e operatori Conversione tra tipi Array Enumerazioni Funzioni e procedure Istruzioni condizionali Istruzione if Istruzione switch Operatore binario Operatore null-conditional Istruzioni iterative Istruzione while Istruzione do...while Istruzione for Istruzione foreach Istruzioni di salto Istruzione break Istruzione continue Istruzione return Istruzione goto Formattazione di stringhe Conclusioni Capitolo 4: Object Oriented Programming Vantaggi dell’Object Oriented Programming Principi fondamentali di OOP Ereditarietà Polimorfismo Incapsulamento Classi Membri di una classe Livelli di accessibilità Creazione delle istanze di classe Classi statiche e parziali Classi statiche Partial class Ereditarietà e polimorfismo Interfacce Strutture Overload degli operatori Tuple Regole di nomenclatura Conclusioni Capitolo 5: Collection e generics Introduzione alle collection La classe ArrayList Dizionari in .NET tramite la classe Hashtable Le interfacce in System.Collections Ulteriori tipologie di collection I Generics e la tipizzazione forte Le collezioni generiche La lista nel mondo dei generics: List<T> Le interfacce nelle collezioni generiche Inizializzazione di una collezione Un dizionario fortemente tipizzato: Dictionary<TKey, TValue> Una collection con elementi univoci: HashSet<T> Altre tipologie di collezioni generiche Creazione di tipi generici Impostare dei vincoli sul tipo generico Un particolare tipo generico: Nullable<T> Assegnazioni tra tipi generici: covarianza e controvarianza Creazione di interfacce covarianti e controvarianti Index e Range Conclusioni Capitolo 6: Delegate ed eventi I Delegate in .NET Definizione e utilizzo di un delegate Modello a oggetti dei delegate Combinazione di delegate: la classe MulticastDelegate Cenni sull’esecuzione asincrona di un delegate I delegate e i generics Anonymous method e lambda expression I delegate come strumento di notifica: gli eventi Definizione e uso di un evento in un oggetto Creare eventi personalizzati Scambiare dati tramite eventi: la classe EventArgs e le sue derivate Definizione esplicita di eventi Conclusioni Capitolo 7: Approfondimenti al linguaggio Gestione delle eccezioni Gli errori prima del .NET Framework Gestione strutturata degli errori tramite le exception La classe System.Exception Realizzare eccezioni personalizzate Lavorare con le eccezioni nel codice Intercettare le eccezioni Il blocco finally L’interfaccia IDisposable e il blocco using Sollevare eccezioni nel codice e best practice Gestione e rilancio delle eccezioni Utilizzo delle InnerException Considerazioni a livello di prestazioni sull’uso delle Exception Esplorare i tipi a runtime con Reflection La classe System.Type Scrittura di codice dinamico Realizzazione di codice dinamico con reflection Codice dinamico tramite la parola chiave dynamic Le classi DynamicObject e ExpandoObject Codice dichiarativo tramite gli attributi Costruire e utilizzare attributi custom: la classe System.Attribute Il compilatore-as-a-service: Roslyn Installazione e primi passi con Roslyn Analisi della sintassi Conclusioni Capitolo 8: Async, multithreading e codice parallelo Processi e thread La classe System.Threading.Thread Passare parametri a un worker thread Controllare il flusso di esecuzione di un thread Il ThreadPool per applicazioni multithreading Asynchronous programming model Utilizzo del metodo EndInvoke Sincronizzazione tramite IAsyncResult e polling Utilizzo di un metodo di callback Esecuzione parallela con Parallel Extensions La Task Parallel Library Composizione di task Nested task e child task