Date post: | 15-May-2015 |
Category: |
Documents |
Upload: | matteo-valoriani |
View: | 6,116 times |
Download: | 13 times |
C# per tuttiCome imparare a programmare e sopravvivere
Matteo ValorianiMicrosoft Student Partner
2
C# Obiettivi del corso
• Fornire le basi teoriche per sviluppare programmare con un linguaggio ad oggetti
• Fornire le basi proatiche per utilizzare il framework .Net
• Familiarizzare con i tool di sviluppo
3
C# Calendario e programma(2)
• 10/11 ore 16.15– Lettura e scrittura file– Serializzazione– Installazione e utilizzo di Blend– Eventi– Grafica e MVVM– XAML - Silverlight– Applicazioni mobile
• 17/11 ore 16.15– Utilizzo di Linq e accesso ai DB– C# elementi avanzati: Extended, Optional parameter, Delegate, Named, Lambda
expressions
4
C# Calendario e programma
• 27/10 ore 16.15– Installazione e utilizzo di Visual Studio 2010– Principi di programmazione a oggetto (OO)– C# primi passi: Oggetti, Tipi, Metodi, Costruttori
• 3/11 ore 16.15– Overload, Eredità, Override– Abstract, Interfaccie, Static– Eccezioni, Documentazione
5
C# 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-ghostdoc-and-sandcastle.aspx
• http://grantpalin.com/2010/01/10/net-projects-generating-documentation-with-sandcastle/
C#
6
C# 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
7
C# 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)
8
C# Framework .Net
• Ambiente 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.• Elimanre 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.
12
C# Prima della programmazione OO
• Anni ‘50 e inizio anni ’60, programmazione a spaghetti:– Basata sul salto incondizionato GOTO
• Anni ’60, programmazione strutturata:– GOTO = ALTERNATIVA + RIPETIZIONE + SEQUENZA
– Programma come workflow
13
C# Prima della programmazione OO
• Anni ’60, programmazione Modulare:– Programma composto da moduli che cooperano
– Ogni modulo è indipendente
– Moduli riusabili
– Sviluppo separato
14
C# I primi linguaggi OO
• Fine 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
15
C# Principi di Programmazione OO
• Astrazione 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, la
– Dichiarazione 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.
16
C# Oggetti
• Stato di un oggetto– Lo stato rappresenta la condizione in cui si trova l’oggetto
– Lo 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)
17
C# Oggetto vs Classe
Compile Time Run Time
Studente
Mario
Laura
Studente.class
CLR
Stessa struttura, ma dati diversi. Sono due diverse
istanze.
Identity=1
Identity=2
18
C# Istanze
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
19
C#Incapsulamento: • 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
Caratteristiche Linguaggio OO
20
C#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
Caratteristiche Linguaggio OO (2)
21
C#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.
Caratteristiche Linguaggio OO (3)
22
C#• Interfaccia:
– 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.
Altre keyword
23
C#• In 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.
Pensare ad oggetti
24
C#• Cosa si vuole che sia in grado di fare?
– Un oggetto che abbia uno o due soli metodi deve fare riflettere
– Oggetti 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,…)
Come si scelgono gli oggetti?
25
C#• Accoppiamento: 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
Accoppiamento & Coesione
27
C#• Integrated 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
Visual studio 2010
28
C#• No componenti visuali (buttons, text boxes, etc.)• Solo output di testo• Due tipi:
– MS-DOS prompt - Windows 95/98/ME
– Command prompt - Windows 2000/NT/XP
Console Application
29
C# Struttura di un progetto
Insieme di progetti
Progetto: raccoglie classi che realizzano il programma
File .CS : contiene il codice C# di una classe
Cartella che contiene le librerie
30
C# Ciao Corso
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.
31
C# Ciao Corso (2)
// Scrive sulla console System.Console.WriteLine("Ciao Corso");
// Aspettta che la persona digiti un carattere System.Console.ReadKey();
Commenti
Namespace OggettoMetodo
32
C#For:
for (int i = 0; i < length; i++)
{//fai qualcosa}
While:
while (condizione==true)
{ //fai qualcosa }
Do:
do{//fai qualcosa
} while (condizione== true);
Strutture base: Cicli
Numero fisso di volte
Finche la condizione è vera il ciclo continua
34
C#If
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
}
Alternative
35
C#class NomeClasse
{
//Proprità
visibilità tipo nomeProrpietà;
//Costruttore
public NomeClasse() { }
//Metodi
visibilità tipoRitornato nomeMetodo1() { }
}
Creare una classe
36
C#• 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
Tipi
37
C#• 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
Enum
38
C#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.
Modificatori di accesso
39
C#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; }
}
Campi e Proprietà
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à
40
C#«Azioni» che permettono di interagire con gli oggetti
Metodi
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
41
C#Servono 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
Costruttori
42
C#Metodo 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;
}
Overload
43
C# static void Main(string[] args)
{
Persona mario = new Persona("Mario", "Verdi");
mario.Email = "[email protected]";
string rit = mario.ChiSei();
Console.Write(rit);
Console.ReadKey();
}
Utilizzo dei metodi
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
44
C#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.
Ereditarietà
Nuova classe
Classe da cui eredita
45
C# 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.
Richiamo costruttore base
46
C# 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
Richiamo costruttore base(2)
47
C#• Sostituisco un metodo della classe basepublic virtual string ChiSei()
public override string ChiSei() {
string result = base.ChiSei();
result = result + "\n" + "La mia matricola è " + matricola;
return result;
}
Override
Nella classe base aggiungo la parola «virtual»
Nella sottoclasse aggiungo la parola «override» prima del metodo
48
C#Metodo alternativo:
public new string ChiSei() {
string result = base.ChiSei();
result = result + "\n" + "La mia matricola è " + matricola;
return result;
}
• In realtà new nasconde la definizione della classe base con lo stesso nome
• Il comportamento risultante è diverso rispetto a override
Override(2)
Nella sottoclasse aggiungo la parola «new» prima del metodo
49
C#Studente mario = new Studente("Mario", "Verdi");
mario.Email = "[email protected]";
string rit = mario.ChiSei();
Console.Write(rit);
Console.Write("\n\n");
rit = (mario as Persona).ChiSei();
Console.Write(rit);
Console.ReadKey();
new Vs override
Casting, uso mario come un oggetto Persona
50
C#DerivedClass B = new DerivedClass();
B.DoWork();
// Calls the new method.
BaseClass A = (BaseClass)B;
A.DoWork();
// Also calls the old method.
new Vs override
Se uso virtual+overrideSe uso new DerivedClass B = new DerivedClass();
B.DoWork();
// Calls the new method.
BaseClass A = (BaseClass)B;
A.DoWork();
// Also calls the new method.
51
C#public sealed class D { // Class members here. }
• Una classe sealed non può essere utilizzata come classe base.
public class D : C {
public sealed override void DoWork() { }
}
La parola chiave sealed prima della parola chiave override nega l'aspetto virtuale del membro per qualsiasi ulteriore classe derivata. Non si può utilizzare override nelle sottoclassi.
Classi e metodi «sealed»
52
C#• 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.
Classi e metodi «abstract»
53
C#• 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. }
«interface»
54
C# Struttura ad oggetti
Classe Astratta
Interfaccia
Classe Concreta1
Classe Concreta2
Descrive i metodi che tutte le classi devono implementare
Implementazione dei metodi validi per tutte le classi
Implementazione specifica dei metodi e funzionalità aggiuntive
55
C#• 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; }
//... }
Classi e metodi «Static»
56
C#• IntelliSense: completamento automatico del codice che si attiva non
appena si inizia a digitare qualcosa nell'editor.
• Refactoring: con questo termine si intende una serie di funzionalità che permettono di modificare velocemente e sistematicamente il codice scritto.
• Code Snippets e Surrounding: gli "snippet" sono porzioni di codice di uso comune, come il codice dei costrutti for e while. Clic col tasto destro del mouse nella finestra del codice e selezionando il comando Insert Snippet..., oppure digitando il nome dello snippet e premendo due volte il tasto TAB
Visual Studio 2010
57
C# 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)
58
C#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
Convenzioni dei nomi(2)
59
C#// commenti in una sola riga/* commenti su più righe *//// Commenti per la generazione della documentazione XML
• In C# è possibile creare documentazione per il codice includendo tag XML nel commento del codice sorgente subito prima del blocco di codice cui fanno riferimento.
Documentazione
<c> <para> <see>
<code> <param> <seealso>
<example> <paramref> <summary>
<exception> <permission> <typeparam>
<include> <remarks> <typeparamref>
<list> <returns> <value>
60
C#/// <summary>
/// Descrizione del metodo
/// </summary>
/// <param name="nomeParametro1">Descrizione Parametro1</param>
/// <exception cref="Exception">Sollevata quando ...</exception>
/// <returns> Descrizione valore di ritorno</returns>
Documentazione(2)
61
C#• /// + tab inserisce automaticamente parte dei
commenti• Sandle Castle permette di generare la
documentazione in vari formati. http://sandcastle.codeplex.com/
• Sandcastle Help File Builder http://shfb.codeplex.com/
• http://broadcast.oreilly.com/2010/09/build-html-documentation-for-y.html#Step1
• http://weblogs.asp.net/sreejukg/archive/2011/01/06/documenting-c-library-using-ghostdoc-and-sandcastle.aspx
Documentazione(3)
62
C#Throw:static double SafeDivision(double x, double y) {
if (y == 0)
throw new System.DivideByZeroException();
return x / y;
}
Eccezioni
Parola chiave per «sollevare» le eccezioni
63
C#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(); }
Eccezioni(2)
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
64
C#• 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
Eccezioni(3)
65
C# 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
Eccezioni Personalizzate
66
C#• 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 (-=)
Delegati
67
C# Delegati(2)public delegate double Delegato(double dVal); // dichiaro un metodo che può essere delegato
class 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
C#• 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».
Eventi
69
C# 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(); }
}
Eventi(2)
70
C#• 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();
Operazioni su file
71
C#StreamWriter sr = new StreamWriter(fs);
sr.Write(text);
sr.Close();
StreamReader sr = new StreamReader("test.txt");
string res = sr.ReadLine();
sr.Close();
Scrivere e leggere su file
Prende come parametro uno Stream o il nome del file
Esistono varie modalità di scrittura
Analogo al Writer
72
C#• 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
Scrivere e leggere su file
73
C#• 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.
Serializzazione
74
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;
Serializzazione C#
75
C#• Per inizializzare automaticamente gli oggetti non serializzati si può
utilizzare l’interfaccia IDeserializationCallback e il metodo OnDeserialization
[Serializable]
public class Persona : IDeserializationCallback {
public void OnDeserialization(object sender)
{tempCount=0;}
// altri metodi….
}
Serializzazione C# (2)
76
C#FileStream fs = new FileStream("Serializzazione.txt",
FileMode.OpenOrCreate);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, mario);
Persona marioDes = (Persona)bf.Deserialize(fs);
fs.Close();
Serializzazione Binaria
File o stream dove salvare l’oggetto
Oggetto per le operazioni di serializzazione
Serializzazione e deserializzazione
Chiudi il file
77
C#• 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
Serializzazione Xml
78
C#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 parametri
public Persona(string nome, string cognome, string email){}
Serializzazione XML(2)
Tipo dell’oggetto che si vuole serializzare
Serializzazione e deserializzazione
79
C#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
Serializzazione XML(3)
80
C#• Insieme di dati collegati secondo un particolare modello
logico in modo da consentire la gestione dei dati stessi (inserimento, ricerca, …)
• Crea una struttura più articolata delle informazioni
• La parola «database» viene spesso usata come abbreviazione dell'espressione database management system (DBMS), che si riferisce invece a software per la creazione e la gestione efficiente dei dati di un database
Database
81
C#• Formato da «Tabelle» le cui colonne sono dette
«Attributi» e rappresentano delle proprietà significative• Le righe dette «Record» o «Tuple» contengono i dati
memorizzati• Il linguaggio per interagire con i DB è SQL(Structured
Query Language)– Nato a metà anni 70 nei lab IBM
– Pensato per l’interrogazione di DB, non per la programmazione
– Non gestisce strutture a oggetto
– Molto rigido
– Non integrato nel linguaggio di programmazione
Database Relazionale
82
C#• Elemento ponte tra il mondo OO e quello dei DB
Relazionali• Permette di utilizzare diversi approcci:
– Database First: parto da un DB già esistente e creo le classi
– Model First: dal modello a oggetti creo il DB
– Code First: simile al precedente, ma gestisco da codice la mappatura con il DB
Entity Framework 4.1 (2)
83
C# Entity Framework 4.1
Interfaccia verso diversi DB(SQLServer, Oracle, mySql, …)
Trasformazione record e entità
Gestione di alto livello degli oggetti
Linguaggi di interrogazione
84
C#• Aggiunto dalla versione 3.5 del framework .Net e fortemente
integrato nel linguaggio.
• Definisce un insieme di operatori che possono essere usati per interrogare e manipolare dati da varie sorgenti che rappresentano i dati sotto forma di oggetti.
• Se la sorgente non memorizza in maniera nativa i dati come oggetti, è necessario l'utilizzo di un connettore per accedere ai dati.
• Il risultato di una query viene restituito come una collezione di oggetti in memoria che possono essere enumerati.
Language Integrated Query (LINQ)
85
C#• from - è la keyword di inizio di ogni query LINQ e specifica la fonte di dati
nella quale dovrà essere eseguita la query.• where - è la clausola che specifica quali elementi saranno ritornati dalla
query; applica una sorta di filtro di selezione.• select - è la clausola che definisce i tipi di valori che saranno prodotti dalla
query.• group - è la clausola che raggruppa i risultati secondo una certa chiave.• orderby - effettua l'ordinamento (ascendente o discendente).• join - permette di effettuare prodotti cartesiani tra più fonti di dati, come in
SQL. • into - è la keyword contestuale che indica in quale variabile temporanea
vengono salvati i risultati di una select, di un group o di un join.• let - è la keyword che permette di salvare temporaneamente il risultato di
una subquery per poi utilizzarlo all'interno della query principale.
Linq keyword
86
C#var query =
from contact in contacts
where contact.FirstName = "Matteo"
orderby contact.ContactID
select new {
ContactID = contact.ContactID,
LastName = contact.LastName,
FirstName = contact.FirstName};
http://msdn.microsoft.com/en-us/vcsharp/aa336746
Esempio Linq