corso pratico di c# - 2013

71
Come imparare a programmare e sopravvivere Corso pratico di C# Matteo Valoriani Microsoft Student Partner [email protected]

Upload: matteo-valoriani

Post on 15-May-2015

2.078 views

Category:

Technology


2 download

DESCRIPTION

Slide del corso "Corso pratico di C#" tenute al Politecnico di Milano/Statale a fine 2013

TRANSCRIPT

Page 1: Corso pratico di C# - 2013

Come imparare a programmare e sopravvivere

Corso pratico di C#

Matteo ValorianiMicrosoft Student Partner

[email protected]

Page 2: Corso pratico di C# - 2013

Obiettivi del corso• Fornire le basi teoriche per sviluppare

programmare con un linguaggio ad oggetti

• Fornire le basi pratiche per utilizzare il framework .Net

• Familiarizzare con i tool di sviluppo

2

Page 3: Corso pratico di C# - 2013

Calendario e programma18/10 Intro - sala conferenze DEIB (16.15-19.00)• Introduzione a VS 2013 • Introduzione al linguaggio C# e alla programmazione a oggetti• Hello word C# • Dreamspark

 3/12 Lezione 1 - Basi per lo sviluppo C# - sala conferenze (14.15-18.00)• WPF (XAML)• Eventi, Delegati• Eccezioni• File, Serializzazione 

3

Page 4: Corso pratico di C# - 2013

Calendario e programma10/12 Lezione 2 - Utilizzo di sensori e interfacce grafiche - sala seminari (14.30-19.00)• Data Binding, • Dispatcher, • Utilizzo sensori (GPS, NFC, Accelerometri)• Sviluppo su telefoni

17/12 Lezione 3 - Utilizzo servizi remoti - sala seminari (14.15 -18.00) • Applicazioni sync/async, • Utilizzo servizi remoti• Sviluppo su tablet

 

4

Page 5: Corso pratico di C# - 2013

Link utili

Libri e esempi:• http://csharpcourse.com/• http://msdn.microsoft.com/it-it/library/aa287551(v=VS.71).aspx• http://www.microsoft.com/italy/beit/Default.aspx

Software:• http://www.asict.polimi.it/software/microsoft/msdn-academic-alliance.html• https://www.dreamspark.com/default.aspx• http://weblogs.asp.net/sreejukg/archive/2011/01/06/documenting-c-library-using-gh

ostdoc-and-sandcastle.aspx• http://grantpalin.com/2010/01/10/net-projects-generating-documentation-with-sand

castle/

5

Page 6: Corso pratico di C# - 2013

Programmazione a Oggetti

6

Page 7: Corso pratico di C# - 2013

Prima della programmazione OOAnni ‘50 e inizio anni ’60, programmazione a spaghetti:Basata sul salto incondizionato GOTO

Anni ’60, programmazione strutturata:GOTO = ALTERNATIVA + RIPETIZIONE + SEQUENZAProgramma come workflow

7

Page 8: Corso pratico di C# - 2013

Prima della programmazione OOAnni ’60, programmazione Modulare:Programma composto da moduli che cooperanoOgni modulo è indipendenteModuli riusabili Sviluppo separato

8

Page 9: Corso pratico di C# - 2013

I primi linguaggi OOFine anni ’60, ideata la programmazione a oggetti

Anni ’70, nasce il primo linguaggio a oggetti SmallTalk

Anni ’80, vengono sviluppati ADA e C++ e si diffonde la programmazione ad oggetto

9

Page 10: Corso pratico di C# - 2013

Principi di Programmazione OOAstrazione dell’idea di programma:Prende spunto dal mondo «reale» per creare un mondo «virtuale»Ogni programma è un insieme di «Oggetti» che interagiscono

Le «Classi»:Idea platonica della forma, laDichiarazione delle strutture dati interne

Operazioni, «metodi», che si possono eseguire sulla struttura dati

Le classi costituiscono dei modelli astratti, che a tempo di esecuzione sono istanziati per creare oggetti software. Questi ultimi sono dotati di proprietà e di metodi secondo quanto dichiarato dalle rispettive classi.

10

Page 11: Corso pratico di C# - 2013

OggettiStato di un oggettoLo stato rappresenta la condizione in cui si trova l’oggettoLo stato è definito dai valori delle variabili interne all'oggetto (proprietà)

Comportamento di un oggetto (behavior)Determina come agisce e reagisce un oggettoÈ definito dall’insieme di operazioni che l’oggetto può compiere (metodi)

11

Page 12: Corso pratico di C# - 2013

Oggetto vs Classe12

Compile Time

Run Time

Studente

Mario

Laura

Studente.class

CLR

Stessa struttura, ma dati diversi. Sono due

diverse istanze.

Identity=1

Identity=2

Page 13: Corso pratico di C# - 2013

Istanze13

Persona______________________

Nome = «Mario»Cognome = «Verdi»

Indirizzo = «Via Roma»Numero = «3»

_____________________MangiareDormire

Cambiare abitazione

persona1

Nome istanza dell’oggetto

Nome Classe

Valore dell’attributo

Nome dell’attributo

Operazioni che la classe è in grado di fare

Page 14: Corso pratico di C# - 2013

Caratteristiche Linguaggio OOIncapsulamento:

i dati che definiscono lo stato interno di un oggetto sono accessibili solo ai metodi dell'oggetto stesso.

Per alterare lo stato interno dell'oggetto, è necessario invocarne i metodi.

L'oggetto è come una black-box, cioè una «scatola nera» di cui attraverso l'interfaccia è noto cosa fa, ma non come lo fa.

Information hiding, gestione della visibilità di quello che accade dentro la scatola

14

Page 15: Corso pratico di C# - 2013

Caratteristiche Linguaggio OO (2)Ereditarietà:

Permette di derivare nuove classi a partire da quelle già definite.

Una classe derivata, sottoclasse, mantiene i metodi e gli attributi delle classi da cui deriva (classi base, o superclassi)

La sottoclasse può definire i propri metodi o attributi e può ridefinire i metodi ereditati (overriding)

Quando una classe eredita da una sola superclasse si parla di eredità singola; viceversa, si parla di eredità multipla.

Meccanismo per ottenere l'estensibilità e il riuso del codice

15

Page 16: Corso pratico di C# - 2013

Caratteristiche Linguaggio OO (3)Polimorfismo:

Le istanze di una sottoclasse possono essere utilizzate al posto di istanze della superclasse

I metodi che vengono ridefiniti in una sottoclasse sono detti polimorfi, in quanto lo stesso metodo si comporta diversamente a seconda del tipo di oggetto su cui è invocato.

16

Page 17: Corso pratico di C# - 2013

Altre keywordInterfaccia:Tipi e operazioni definiti in un componente che sono visibili fuori del componente stesso.

Specifica:Funzionamento del componente, espresso mediante proprietà osservabili attraverso l'interfaccia.

Implementazione:Strutture dati e funzioni definiti dentro al componente, non necessariamente visibili da fuori.

17

Page 18: Corso pratico di C# - 2013

Pensare ad oggettiIn un programma di tipo procedurale, si è soliti iniziare a ragionare in maniera top-down, partendo cioè dal main e creando mano a mano tutte le procedure necessarie.

Pensare ad oggetti vuole dire identificare gli oggetti che entrano in gioco nel programma che vogliamo sviluppare e saperne gestire l'interazione degli uni con gli altri.

Nella programmazione ad oggetti serve definire prima le classi e poi associare ad esse le proprietà ed i metodi opportuni.

18

Page 19: Corso pratico di C# - 2013

Come si scelgono gli oggetti?Cosa si vuole che sia in grado di fare?Un oggetto che abbia uno o due soli metodi deve fare riflettereOggetti senza o con troppi metodi sono, in genere, da evitare

Quali proprietà sono necessarie affinché l'oggetto sia in grado di eseguire le proprie azioni?Attributi, proprietà che descrivono le caratteristiche peculiari di un oggetto (peso, altezza, …)Componenti, proprietà che sono atte a svolgere delle azioni(testa, mani, piedi, …)Peer objects, proprietà che a loro volta sono identificate e definite in altri oggetti (auto di una persona,…)

19

Page 20: Corso pratico di C# - 2013

Accoppiamento & CoesioneAccoppiamento: quanto sono legate (dipendenze reciproche) due unità separate di un programma.

Coesione: quantità e eterogeneità dei task di cui una singola unità (una classe o un metodo) è responsabile. Se una classe ha una responsabilità ristretta ad un solo compito il valore della coesione è elevato.

Obiettivo: alta coesione e basso accoppiamento

20

Page 21: Corso pratico di C# - 2013

C#

Page 22: Corso pratico di C# - 2013

Storia (solo un po’)In principio fu la luce ….

Gennaio 1999, Anders Hejlsberg crea un team per realizzare un nuovo linguaggio chiamato Cool, C-like Object Oriented Language

Gennaio 2002, il framework .Net è disponibile per il download e il linguaggio è rinominato C#

Settembre 2005, esce la v.2, C# diventa una valida alternativa a Java

Agosto 2007, esce la v.3 e successivamente la 3.5 (attualmente la più usata) che introducono elementi funzionali nel linguaggio

Aprile 2010, esce la v.4

22

Page 23: Corso pratico di C# - 2013

Caratteristiche di C#Multi-paradigm programming language

Language interoperability(C/C++, VB,…)

Interoperabilità via standard web(SOAP, XML,…)

Linguaggio Object Oriented (Tutto è DAVVERO un oggetto)

23

Page 24: Corso pratico di C# - 2013

Framework .NetAmbiente di programmazione orientato agli oggetti coerente

Minimizzi la distribuzione del software e i conflitti di versioni.

Esecuzione sicura anche dei codici creati da produttori sconosciuti o semi-trusted.

Eliminare i problemi di prestazioni degli ambienti basati su script o interpretati.

Rendere coerente l'esperienza dello sviluppatore attraverso tipi molto vari di applicazioni (web, windows, mobile)

Generare tutte le comunicazioni in base agli standard industriali per assicurare che il codice basato su .NET Framework possa integrarsi con qualsiasi altro codice.

24

Page 25: Corso pratico di C# - 2013

Architettura25

Page 26: Corso pratico di C# - 2013

Ora iniziamo veramente

Page 27: Corso pratico di C# - 2013

Visual studio 2013Integrated Development Environment (IDE)

Supporto a molti linguaggi: C, C++, C#, F#, Visual Basic .Net e ASP .Net

Integra la tecnologia IntelliSense la quale permette di correggere errori prima ancora di compilare

27

Page 28: Corso pratico di C# - 2013

Console Application No componenti visuali (buttons, text boxes, etc.)

Solo output di testo

Due tipi:MS-DOS prompt - Windows 95/98/MECommand prompt - Windows 2000/NT/XP

28

Page 29: Corso pratico di C# - 2013

Struttura di un progetto29

Insieme di progetti

Progetto: raccoglie classi che realizzano il programma

File .CS : contiene il codice C# di una classe

Cartella che contiene le librerie

Page 30: Corso pratico di C# - 2013

Ciao Corso30

using System;

namespace CiaoCorso{ class Program { static void Main(string[] args) { // Scrive sulla console System.Console.WriteLine("Ciao Corso"); // Aspettta che la persona digiti un carattere System.Console.ReadKey(); } }}

Indica dove prendere le librerie usate

Metodo per raggruppare le funzionalità

Nome della classe

Metodo speciale: punto di ingresso dell’applicazione. Ogni applicazione ne deve avere uno.

Page 31: Corso pratico di C# - 2013

Ciao Corso (2)31

// Scrive sulla console System.Console.WriteLine("Ciao Corso");

// Aspettta che la persona digiti un carattere System.Console.ReadKey();

Commenti

Namespace

OggettoMetodo

Page 32: Corso pratico di C# - 2013

Strutture base: CicliFor: for (int i = 0; i < length; i++)

{//fai qualcosa}While: while (condizione==true)

{ //fai qualcosa }Do:do{//fai qualcosa } while (condizione== true);

32

Numero fisso di volte

Finche la condizione è vera il ciclo continua

Page 33: Corso pratico di C# - 2013

Strutture base: Cicli(2)For:foreach (Persona item in listaPersone) { item.ChiSei(); }

33

Page 34: Corso pratico di C# - 2013

AlternativeIf if (condizione == true) {//fai qualcosa }else {//fai qualcosa}

Switch switch (switch_on) { case 1://fai qualcosa break; case 2://fai qualcosa break; default: //fai qualcosa }

34

Page 35: Corso pratico di C# - 2013

Calendario e programma

3/12 Lezione 1 - Basi per lo sviluppo C# - sala conferenze (14.15-18.00)

9/12 Lezione 2 - Utilizzo di sensori e interfacce grafiche – GOLGI 206(16.00-19.00)10/12 Lezione 2 – Smart and Beyond: Nokia – sala conferenze (9.15-13.00)10/12 Lezione 2 – Smart and Beyond: Lab Nokia – sala seminari (15.15-18.00)

17/12 Lezione 3 - Utilizzo servizi remoti – GOLGI 207 (14.15 -18.00) 18/12 Lezione 2 – Smart and Beyond: Windows 8.1 – sala conferenze (14.15-17.00)18/12 Lezione 2 – Smart and Beyond: Lab Windows 8– sala conferenze (17.15-19.00)

http://matteovaloriani.eventbrite.com/

35

Page 36: Corso pratico di C# - 2013

Creare una classeclass NomeClasse { //Proprità visibilità tipo nomeProrpietà;

//Costruttore public NomeClasse() { }

//Metodi visibilità tipoRitornato nomeMetodo1() { } }

36

Page 37: Corso pratico di C# - 2013

Convenzioni dei nomi(2)37

Identificatore Case Esempio

Classe Pascal AppDomain

Tipo di enumerazione Pascal ErrorLevel

Valori di enumerazione Pascal FatalError

Evento Pascal ValueChanged

Classe dell'eccezione Pascal WebException

Campo statico di sola lettura Pascal RedValue

Interfaccia Pascal IDisposable

Metodo Pascal ToString

Spazio dei nomi Pascal System.Drawing

Parametro Camel typeName

Property Pascal BackColor

Page 38: Corso pratico di C# - 2013

Modificatori di accesso38

public Nessuna restrizione di accesso.

protected L'accesso è limitato alla classe di appartenenza o ai tipi derivati dalla classe di appartenenza.

internal L'accesso è limitato all'assembly corrente.

protected internal L'accesso è limitato all'assembly corrente o ai tipi derivati dalla classe di appartenenza.

private L'accesso è limitato al tipo di appartenenza.

Page 39: Corso pratico di C# - 2013

Tipi• Signed sbyte, short, int, long• Unsigned byte, ushort, uint, ulong• Character char• Floating-point float, double, decimal• Logical bool• Reference object, string

In realtà tutti sono tipi «alias» di oggetti:• object: System.Object• string: System.String• bool: System.Boolean• int: System.Int32

39

Page 40: Corso pratico di C# - 2013

Campi e ProprietàLe proprietà consentono a una classe di esporre un modo pubblico per ottenere e impostare valori, nascondendo tuttavia il codice di implementazione o di verifica.

private string email; public string Email { get { return email; } set { email = value; } }

40

Parola chiave usata alla fine di metodi che restituiscono un valore

Parola chiave, si riferisce al valore passato che vogliamo assegnare

Abilito la letture, get, e la scrittura della proprietà, set

Campo

Proprietà

Page 41: Corso pratico di C# - 2013

Enum•  Modo efficiente per definire un insieme di costanti integrali che possono

essere assegnate a una variabile• Per impostazione predefinita, il tipo sottostante di ogni elemento

dell'enumerazione è int, ma si può assegnare altri tipi numerici• Si può assegnare in modo esplicito il valore

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; enum MachineState { PowerOff = 0, Running = 5, Sleeping = 10, Hibernating = Sleeping + 5 }

Days meetingDay = Days.Monday;Console.WriteLine(meetingDay ); //Monday

41

Page 42: Corso pratico di C# - 2013

Metodi«Azioni» che permettono di interagire con gli oggetti

42

public string ChiSei() { string result = ""; result = "Io sono " + nome + " " + cognome + "/n"; result = result + "La mia email è " + email; return result; }

Creo una stringa vuota

Il simbolo + viene usato per «concatenare», cioè unire, le stringhe

Alla stringa iniziale concateno altre parti

Valore restituito dalla funzione

Tipo restituito

Page 43: Corso pratico di C# - 2013

CostruttoriServono per creare l’istanza della classe, cioè l’oggetto usato durante l’esecuzione del programma

private string Nome; private string Cognome;

public Persona(string Nome, string Cognome) { this.Nome = Nome; this.Cognome = Cognome; }

La keyword this permette di risolvere i problemi di nomi

43

Page 44: Corso pratico di C# - 2013

OverloadMetodo con stesso nome, ma con parametri diversi o con valore di ritorno diverso

public Persona(string Nome, string Cognome, ) { this.Nome = Nome; this.Cognome = Cognome; }

public Persona(string nome, string cognome, string email) { this.nome = nome; this.cognome = cognome; this.email = email; }

44

Page 45: Corso pratico di C# - 2013

Utilizzo dei metodi static void Main(string[] args) { Persona mario = new Persona("Mario", "Verdi");

mario.Email = "[email protected]";

string rit = mario.ChiSei(); Console.Write(rit); Console.ReadKey(); }

45

La keyword new, serve per creare nuovi oggetti. Si usa prima del costruttore

Le proprietà si utilizzano semplicemente con = senza le ()

Classica chiamata di un metodo con valore di ritorno

Page 46: Corso pratico di C# - 2013

EreditarietàPermette di estendere classi già esistenti con nuove funzionalità, senza dover riscrivere tutto il codice

class Studente : Persona { … }

• La classe Studente(S) è effettivamente sia Studente che Persona(P).• È possibile utilizzare un'operazione di «cast» per convertire S in un

oggetto P. L'operazione di cast non implica la modifica dell'oggetto S, ma limita semplicemente la visualizzazione dell'oggetto S ai dati e ai comportamenti dell'oggetto P

• Dopo aver eseguito il cast di un oggetto S in un oggetto P, è possibile eseguire il cast dell'oggetto P per convertirlo di nuovo in S.

• Non è possibile fare il cast da P a S se l’oggetto non è un istanza di S.

46

Nuova classe

Classe da cui eredita

Page 47: Corso pratico di C# - 2013

Richiamo costruttore base private int matricola; public Studente(string nome, string cognome,

int matricola) : base(nome, cognome) { this.matricola = matricola; }

• La keyword «base» che richiama i metodi della classe base, in questo caso direttamente il costruttore, e gli passa i parametri

• Dopo l’esecuzione del costruttore della classe base, vengono eseguite le operazioni rimanenti.

47

Page 48: Corso pratico di C# - 2013

Richiamo costruttore base(2) private int matricola; public Studente(string nome, string cognome,

int matricola) : base(nome, cognome) { this.matricola = matricola; }• La keyword «base» che richiama i metodi della classe base, in questo caso

direttamente il costruttore, e gli passa i parametri• Dopo l’esecuzione del costruttore della classe base, vengono eseguite le operazioni

rimanenti.

public Studente(string nome, string cognome) : this(nome, cognome, 00000) { }

• In questo caso il costruttore richiama il costruttore definito prima settando un valore di default per la matricola

48

Page 49: Corso pratico di C# - 2013

Override• Sostituisco un metodo della classe base

public virtual string ChiSei()

public override string ChiSei() { string result = base.ChiSei(); result = result + "\n" + "La mia matricola è " +

matricola; return result; }

49

Nella classe base aggiungo la parola «virtual»

Nella sottoclasse aggiungo la parola «override» prima del metodo

Page 50: Corso pratico di C# - 2013

Classi e metodi «abstract»• Non è possibile creare un'istanza di una classe astratta. • Scopo di una classe astratta è di fornire una definizione comune di

una classe base condivisibile da più classi derivate.public abstract class A { // Class members here. }

• Le classi astratte possono inoltre definire metodi astratti aggiungendo la parola chiave abstract prima del tipo restituito del metodo

public abstract class A { public abstract void DoWork(int i);

}• I metodi astratti non prevedono implementazione• La definizione del metodo è seguita da un punto e virgola.• Le classi derivate della classe astratta devono implementare tutti i

metodi astratti. 

54

Page 51: Corso pratico di C# - 2013

«interface»• Le interfacce vengono definite tramite la parola chiave «interface»• Un'interfaccia è un gruppo completamente astratto di membri che può essere

considerato come la definizione di un contratto: chi implementa una interfaccia si impegna a scrivere il codice per ciascun metodo.

• I membri delle interfacce sono automaticamente pubblici.public interface IEsempio {

void Metodo1(); bool Metodo2();

string Proprieta1 { get; set; } int Proprieta2 { get; }

}public class Esempio : Iesempio{// Implementazione. }

55

Page 52: Corso pratico di C# - 2013

Struttura ad oggetti56

Classe Astratta

Interfaccia

Classe Concret

a1

Classe Concret

a2

Descrive i metodi che tutte le classi devono implementare

Implementazione dei metodi validi per tutte le classi

Implementazione specifica dei metodi e funzionalità aggiuntive

Page 53: Corso pratico di C# - 2013

Classi e metodi «Static»• Le classi statiche e i relativi membri vengono utilizzati per creare dati e

funzioni a cui sia possibile accedere senza creare un'istanza della classe. • Una classe può essere dichiarata statica per indicare che contiene solo

membri statici.• Non è possibile creare istanze di una classe statica utilizzando la parola

chiave new. • Spesso usate come classi di supporto

static class TempConverter { public static double CelsiusToFahrenheit(string temperatureCelsius){

double celsius = System.Double.Parse(temperatureCelsius); double fahrenheit = (celsius * 9 / 5) + 32;

return fahrenheit; }//... }

57

Page 54: Corso pratico di C# - 2013

Convenzioni dei nomi• Convenzione Pascal:

• La prima lettera dell'identificatore e la prima lettera di ogni parola concatenata successiva sono in maiuscolo. È possibile utilizzare la convenzione Pascal per gli identificatori costituiti da tre o più caratteri. (BackColor)

• Convenzione Camel:• La prima lettera dell'identificatore è in minuscolo, mentre

la prima lettera di ogni parola concatenata successiva è in maiuscolo. (backColor)

59

Page 55: Corso pratico di C# - 2013

EccezioniThrow:static double SafeDivision(double x, double y) {

if (y == 0) throw new System.DivideByZeroException();

return x / y; }

63

Parola chiave per «sollevare» le eccezioni

Page 56: Corso pratico di C# - 2013

Eccezioni(2)Try/Cath/Finally:try {

result = SafeDivision(a, b);Console.WriteLine("{0} divided by {1} = {2}", a, b, result);

}catch (DivideByZeroException e) {

Console.WriteLine("Divisione per 0"); }catch (Exception e) {

Console.WriteLine("Altra eccezione"); }finally {Console.WriteLine("Fine programma");

Cosolole.ReadLine(); }

64

In questo blocco si inseriscono le operazioni che si tentano di eseguire

Istruzioni da eseguire se si verificano Eccezioni di tipo DivideByZeroException

Operazioni che volgiamo comunque eseguire

Istruzioni da eseguire se si verificano Eccezioni di tipo diverso da DivideByZeroException

Page 57: Corso pratico di C# - 2013

Eccezioni(3)• Se per una determinata eccezione non sono presenti gestori,

l'esecuzione del programma verrà interrotta con un messaggio di errore

• Gli oggetti eccezione contengono informazioni dettagliate sull'errore, ad esempio lo stato dello stack di chiamate e una descrizione dell'errore

• È meglio evitare la gestione delle eccezioni, cercando di prevedere le cause che possono portare ad una situazione imprevista

• Un abuso di try...catch può appesantire molto un programma

65

Page 58: Corso pratico di C# - 2013

Eccezioni Personalizzate class MiaException : Exception{ public MiaException() : base() { } public MiaException(string message) : base(message) {} public MiaException(string message, System.Exception inner)

: base(message, inner) { } protected MiaException(System.Runtime.Serialization. SerializationInfo info,System.Runtime.Serialization. StreamingContext context) { }

}

• Costruttori che dovrebbero essere implementati nella nuova classe• È possibile aggiungere altri costruttori e metodi

66

Page 59: Corso pratico di C# - 2013

Delegati• Meccanismo per associare ad un metodo un

implementazione realizzata da un’altro metodo• Simile ai puntatori a finzione del C e alle callback di

C++• I delegati si possono sommare (+=) e sottrarre (-=)

67

Page 60: Corso pratico di C# - 2013

Delegati(2)public delegate double Delegato(double dVal); // dichiaro un metodo che può essere delegatoclass Program { static void Main(string[] args) { Program pr = new Program(); // associo al metodo delegato una implementazione Delegato q = new Delegato(pr.Quadrato); q += new Delegato(pr.Cubo); // eseguo le normali operazioni sul delegato double dVal = Double.Parse(Console.ReadLine()); dVal = q(dVal); Console.ReadKey(); } //implementazione del metodo quadrato public double Quadrato(double dVal) {

Console.WriteLine("sono il delegato calcolo il quadrato di " + dVal + " : " + dVal*dVal); return dVal*dVal; } //implementazione del metodo cubo public double Cubo(double dVal) {

Console.WriteLine("sono il delegato calcolo il cubo di " + " : " + dVal * dVal*dVal); return dVal* dVal * dVal; } }

68

Page 61: Corso pratico di C# - 2013

Eventi• Gli eventi sono simili alle chiamate di metodo, ma la

loro invocazione deve essere generata esternamente. 

• Un esempio è la pressione di un pulsante in una interfaccia grafica o una pagina web.

• Tramite gli eventi una classe o un oggetto sono in grado di segnalare ad altre classi o oggetti una situazione di interesse.

• La classe che genera l'evento è chiamata autore e le classi che gestiscono l'evento sono chiamate «hendler».

69

Page 62: Corso pratico di C# - 2013

Eventi(2) class OggettoConEvento { public event EventHandler nuovoEvento; public void ScatenaEvento( { if (nuovoEvento != null) nuovoEvento(this, EventArgs.Empty); } }

class Program { static void Main(string[] args) { OggettoConEvento obj = new OggettoConEvento(); obj.nuovoEvento += new EventHandler(obj_nuovoEvento); System.Threading.Thread.Sleep(1000*4); obj.ScatenaEvento(); }

static void obj_nuovoEvento(object sender, EventArgs e) { Console.WriteLine("si è scatenato un evento"); Console.ReadKey(); } }

70

Page 63: Corso pratico di C# - 2013

Operazioni su file• La classe statica File permette le operazioni sui file• Verificare che un file esiste:

File.Exists(FILE_NAME);

• FileStream permette di accedere o creare un file:FileStream fs = new FileStream("test.txt",

FileMode.Open, FileAccess.ReadWrite);

• Sempre chiudere il file al termine delle operazioni o le modifiche potrebbero andare perse:

fs.Close();

71

Page 64: Corso pratico di C# - 2013

Scrivere e leggere su fileStreamWriter sr = new StreamWriter(fs);sr.Write(text);sr.Close();

StreamReader sr = new StreamReader("test.txt");string res = sr.ReadLine();sr.Close();

72

Prende come parametro uno Stream o il nome del file

Esistono varie modalità di scrittura

Analogo al Writer

Page 65: Corso pratico di C# - 2013

Scrivere e leggere su file• Attenzione a gestire le numerose eccezioni che

possono essere sollevate• Si può eseguire operazioni anche in file binario

(BinaryWriter e BinaryReader)• Esistono molte variazioni sul tema

73

Page 66: Corso pratico di C# - 2013

Serializzazione• Utile per salvare un oggetto in un supporto di memorizzazione lineare

(un file o un'area di memoria) o per trasmetterlo su una connessione di rete

• In forma binaria o può utilizzare codifiche testuali (XML,…)• Lo stato dell'oggetto può essere ricreato nello stesso identico stato

dal processo inverso, chiamato deserializzazione.• La serializzazione mina l'incapsulamento di un tipo di dato astratto

esponendone potenzialmente i dettagli implementativi privati. • Per scoraggiare i concorrenti dal realizzare prodotti compatibili con i

propri spesso i produttori di software proprietari mantengono segreti i dettagli dei formati di serializzazione dei loro programmi. Alcuni offuscano o cifrano deliberatamente i dati serializzati.

74

Page 67: Corso pratico di C# - 2013

Serializzazione C#• Per rendere un oggetto serializzabile basta aggiungere l’attributo [Serializable] prima della classe

[Serializable]public class Persona {// classe}

• Di default tutte le proprietà e i campi diventano serializzabili, anche quelli privati, è possibile disabilitare la serializzazione con l’attributo [NonSerialized]

[NonSerialized]private string tempCount;

75

Page 68: Corso pratico di C# - 2013

Serializzazione BinariaFileStream fs = new FileStream("Serializzazione.txt",

FileMode.OpenOrCreate);

BinaryFormatter bf = new BinaryFormatter();

bf.Serialize(fs, mario);Persona marioDes = (Persona)bf.Deserialize(fs);

fs.Close();

77

File o stream dove salvare l’oggetto

Oggetto per le operazioni di serializzazione

Serializzazione e deserializzazione

Chiudi il file

Page 69: Corso pratico di C# - 2013

Serializzazione Xml• Serializzazione SOAP: stessa procedura di prima

utilizzando la classe SoapFormatter • System.Runtime.Serialization.Formatters.Soap.dll

• Esiste un altro modo per serializzare in XML e personalizzare il file di output• Maggiore interoperabilità • Semplicità di gestione • Migliore compatibilità all’indietro• E’ possibile serializzare soltanto membri pubblici e non

privati di una classe• Non è possibile serializzare oggetti grafici

78

Page 70: Corso pratico di C# - 2013

Serializzazione XML(2)FileStream fs = new FileStream("Serializzazione.txt",

FileMode.OpenOrCreate); XmlSerializer xs = new XmlSerializer(typeof(Persona));

xs.Serialize(fs, mario);Persona mario = (Persona)xs.Deserialize(fs);fs.Close();

• La classe Persona deve implementare un costruttore senza parametripublic Persona(string nome, string cognome, string email){}

79

Tipo dell’oggetto che si vuole serializzare

Serializzazione e deserializzazione

Page 71: Corso pratico di C# - 2013

Serializzazione XML(3)Attributi che possono essere aggiunti per personalizzare il file di output:

• [XmlIgnore()], permette di non serializzare un membro pubblico• [XmlElement(ElementName = "TaxRate")], permette di cambiare il nome

dell’attributo nel file xml• [XmlArray("ListaPersona")], permette di definire il nome di una lista di oggetti• [XmlArrayItem("Persona")], permette di definire il nome degli elementi dentro

una lista

80