Corso pratico di C#
Come imparare a programmare e sopravvivere

Matteo Valoriani
Microsoft Student Partner
mvaloriani@gmail.com
2
3

Calendario e programma
4

Calendario e programma
5

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

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-ghostdocand-sandcastle.aspx
http://grantpalin.com/2010/01/10/net-projects-generating-documentation-with-sandcastle/
6
7

Prima della programmazione OO
8

Prima della programmazione OO
9

I primi linguaggi OO
10

Principi di Programmazione OO
11

Oggetti
12

Oggetto vs Classe
Compile Time

Run Time
Mario

Studente.class

Identity=
1

Studente

Laura
Identity=
2

CLR

Stessa struttura, ma dati
diversi. Sono due diverse
istanze.
13

Istanze
Nome Classe

persona1
Nome istanza
dell’oggetto

Nome
dell’attributo

Operazioni che
la classe è in
grado di fare

Persona
______________________
Nome = «Mario»
Cognome = «Verdi»
Indirizzo = «Via Roma»
Numero = «3»
_____________________
Mangiare
Dormire
Cambiare abitazione

Valore
dell’attributo
14

Caratteristiche Linguaggio OO
15

Caratteristiche Linguaggio OO (2)
16

Caratteristiche Linguaggio OO (3)
17

Altre keyword
18

Pensare ad oggetti
19

Come si scelgono gli oggetti?
20

Accoppiamento & Coesione
Storia (solo un po’)
Anders Hejlsberg

22
23

Caratteristiche di C#
24

Framework .Net
25

Architettura
27

Visual studio 2013
28

Console Application
29

Struttura di un progetto
Insieme di progetti

Cartella che contiene
le librerie

File .CS : contiene il codice C# di
una classe
Progetto: raccoglie classi che
realizzano il programma
30

Ciao Corso
using System;

Indica dove prendere le librerie
usate
Metodo per raggruppare le
funzionalità

namespace CiaoCorso
{
Nome della classe
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();
}
}
}
Metodo speciale: punto di ingresso
dell’applicazione. Ogni applicazione
ne deve avere uno.
31

Ciao Corso (2)
Commenti

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

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

Namespace

Oggetto

Metodo
32

Strutture base: Cicli
Numero fisso di volte

for (int i = 0; i < length; i++)
{//fai qualcosa}
While:
while (condizione==true)
{ //fai qualcosa }
do{//fai qualcosa
} while (condizione== true);

Finche la condizione è vera il
ciclo continua
33

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

Alternative
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
}
35

Calendario e programma

http://matteovaloriani.eventbrite.com/
36

Creare una classe
class NomeClasse
{
//Proprità
visibilità tipo nomeProrpietà;
//Costruttore
public NomeClasse() { }
//Metodi
visibilità tipoRitornato nomeMetodo1() { }
}
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
38

Modificatori di accesso
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.
39

Tipi
40

Campi e Proprietà

Campo

Parola chiave usata alla fine di
metodi che restituiscono un
valore

private string email;
Parola chiave, si riferisce al
public string Email
valore passato che vogliamo
{
assegnare
Proprietà
get { return email; }
set { email = value; }
}
Abilito la letture, get, e la scrittura della proprietà, set
41

Enum

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;
meetingDay //Monday
42

Metodi
Tipo restituito
Creo una stringa vuota

public string ChiSei() {
string result = "";
result = "Io sono " + nome + " " + cognome + "/n";
result = result + "La mia email è " + email;
return result;
}
Il simbolo + viene usato per
«concatenare», cioè unire, le stringhe

Alla stringa iniziale concateno altre
parti
Valore restituito dalla funzione
43

Costruttori

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

Overload
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;
}
45

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

mario.Email = "mario@polimi.it";
Le proprietà si utilizzano semplicemente con = senza le ()
string rit = mario.ChiSei();
Console.Write(rit);
Console.ReadKey();
}

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

Classica chiamata di un
metodo con valore di
ritorno
46

Ereditarietà
class Studente : Persona
{ … }
Nuova classe

Classe da cui eredita
47

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.
48

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
49

Override
public virtual string ChiSei()

Nella classe base aggiungo la parola
«virtual»

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

Nella sottoclasse aggiungo la parola «override»
prima del metodo
54

Classi e metodi «abstract»
public abstract class A { // Class members here. }

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

«interface»

public interface IEsempio {
void Metodo1();
bool Metodo2();
string Proprieta1 { get; set; }
int Proprieta2 { get; }
}
public class Esempio : Iesempio{// Implementazione. }
56

Struttura ad oggetti
Descrive i metodi che tutte le
classi devono implementare

Interfaccia

Classe Astratta

Classe
Concreta
1

Classe
Concreta
2

Implementazione dei metodi
validi per tutte le classi

Implementazione specifica dei
metodi e funzionalità
aggiuntive
57

Classi e metodi «Static»

static class TempConverter {
public static double CelsiusToFahrenheit(string temperatureCelsius){
double celsius = System.Double.Parse(temperatureCelsius);
double fahrenheit = (celsius * 9 / 5) + 32;
return fahrenheit; }
//... }
59
63

Eccezioni
static double SafeDivision(double x, double y) {
if (y == 0)
throw new System.DivideByZeroException();
return x / y;
}

Parola chiave per «sollevare» le eccezioni
64

Eccezioni(2)
In questo blocco si inseriscono le
operazioni che si tentano di eseguire

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(); }

Istruzioni da eseguire se si verificano
Eccezioni di tipo DivideByZeroException

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

Operazioni che volgiamo comunque
eseguire
65

Eccezioni(3)
66

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
67

Delegati
68

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; }
}
69

Eventi
70

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();
}
}

{
71

Operazioni su file

• 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();
72

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

Prende come parametro uno Stream o
il nome del file

Esistono varie modalità di scrittura

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

Analogo al Writer
73

Scrivere e leggere su file

BinaryWriter

BinaryReader
74

Serializzazione
75

Serializzazione C#
Serializable] prima della classe
Serializable]
public class Persona {// classe}

NonSerialized]
NonSerialized]
private string tempCount;
77

Serializzazione Binaria
FileStream fs = new FileStream("Serializzazione.txt",
FileMode.OpenOrCreate);
File o stream dove salvare l’oggetto
BinaryFormatter bf = new BinaryFormatter();

Persona

Oggetto per le operazioni di
serializzazione
Persona)bf.Deserialize(fs);

Serializzazione e deserializzazione
Chiudi il file
78

Serializzazione Xml
79

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();

Tipo dell’oggetto che si
vuole serializzare

• La classe Persona deve implementare un costruttore senza parametri
public Persona(string nome, string cognome, string email){}
Serializzazione e
deserializzazione
80

Serializzazione XML(3)
XmlIgnore()],
XmlElement(ElementName = "TaxRate")],

•

XmlArray("ListaPersona")],
[XmlArrayItem("Persona")],

Corso pratico di C# - 2013

  • 1.
    Corso pratico diC# Come imparare a programmare e sopravvivere Matteo Valoriani Microsoft Student Partner mvaloriani@gmail.com
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
    12 Oggetto vs Classe CompileTime Run Time Mario Studente.class Identity= 1 Studente Laura Identity= 2 CLR Stessa struttura, ma dati diversi. Sono due diverse istanze.
  • 13.
    13 Istanze Nome Classe persona1 Nome istanza dell’oggetto Nome dell’attributo Operazioniche la classe è in grado di fare Persona ______________________ Nome = «Mario» Cognome = «Verdi» Indirizzo = «Via Roma» Numero = «3» _____________________ Mangiare Dormire Cambiare abitazione Valore dell’attributo
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
    19 Come si scelgonogli oggetti?
  • 20.
  • 22.
    Storia (solo unpo’) Anders Hejlsberg 22
  • 23.
  • 24.
  • 25.
  • 27.
  • 28.
  • 29.
    29 Struttura di unprogetto Insieme di progetti Cartella che contiene le librerie File .CS : contiene il codice C# di una classe Progetto: raccoglie classi che realizzano il programma
  • 30.
    30 Ciao Corso using System; Indicadove prendere le librerie usate Metodo per raggruppare le funzionalità namespace CiaoCorso { Nome della classe 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(); } } } Metodo speciale: punto di ingresso dell’applicazione. Ogni applicazione ne deve avere uno.
  • 31.
    31 Ciao Corso (2) Commenti //Scrive sulla console System.Console.WriteLine("Ciao Corso"); // Aspettta che la persona digiti un carattere System.Console.ReadKey(); Namespace Oggetto Metodo
  • 32.
    32 Strutture base: Cicli Numerofisso di volte for (int i = 0; i < length; i++) {//fai qualcosa} While: while (condizione==true) { //fai qualcosa } do{//fai qualcosa } while (condizione== true); Finche la condizione è vera il ciclo continua
  • 33.
    33 Strutture base: Cicli(2) foreach(Persona item in listaPersone) { item.ChiSei(); }
  • 34.
    34 Alternative 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 }
  • 35.
  • 36.
    36 Creare una classe classNomeClasse { //Proprità visibilità tipo nomeProrpietà; //Costruttore public NomeClasse() { } //Metodi visibilità tipoRitornato nomeMetodo1() { } }
  • 37.
    37 Identificatore Case Esempio Classe Pascal AppDomain Tipo di enumerazione Pascal ErrorLevel Valoridi 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
  • 38.
    38 Modificatori di accesso public Nessunarestrizione 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.
  • 39.
  • 40.
    40 Campi e Proprietà Campo Parolachiave usata alla fine di metodi che restituiscono un valore private string email; Parola chiave, si riferisce al public string Email valore passato che vogliamo { assegnare Proprietà get { return email; } set { email = value; } } Abilito la letture, get, e la scrittura della proprietà, set
  • 41.
    41 Enum 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; meetingDay //Monday
  • 42.
    42 Metodi Tipo restituito Creo unastringa vuota public string ChiSei() { string result = ""; result = "Io sono " + nome + " " + cognome + "/n"; result = result + "La mia email è " + email; return result; } Il simbolo + viene usato per «concatenare», cioè unire, le stringhe Alla stringa iniziale concateno altre parti Valore restituito dalla funzione
  • 43.
    43 Costruttori private string Nome; privatestring Cognome; public Persona(string Nome, string Cognome) { this.Nome = Nome; this.Cognome = Cognome; } this
  • 44.
    44 Overload 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; }
  • 45.
    45 Utilizzo dei metodi staticvoid Main(string[] args) { Persona mario = new Persona("Mario", "Verdi"); mario.Email = "mario@polimi.it"; Le proprietà si utilizzano semplicemente con = senza le () string rit = mario.ChiSei(); Console.Write(rit); Console.ReadKey(); } La keyword new, serve per creare nuovi oggetti. Si usa prima del costruttore Classica chiamata di un metodo con valore di ritorno
  • 46.
    46 Ereditarietà class Studente :Persona { … } Nuova classe Classe da cui eredita
  • 47.
    47 Richiamo costruttore base privateint 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.
  • 48.
    48 Richiamo costruttore base(2) privateint 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
  • 49.
    49 Override public virtual stringChiSei() Nella classe base aggiungo la parola «virtual» public override string ChiSei() { string result = base.ChiSei(); result = result + "n" + "La mia matricola è " + matricola; return result; } Nella sottoclasse aggiungo la parola «override» prima del metodo
  • 50.
    54 Classi e metodi«abstract» public abstract class A { // Class members here. } public abstract class A { public abstract void DoWork(int i); }
  • 51.
    55 «interface» public interface IEsempio{ void Metodo1(); bool Metodo2(); string Proprieta1 { get; set; } int Proprieta2 { get; } } public class Esempio : Iesempio{// Implementazione. }
  • 52.
    56 Struttura ad oggetti Descrivei metodi che tutte le classi devono implementare Interfaccia Classe Astratta Classe Concreta 1 Classe Concreta 2 Implementazione dei metodi validi per tutte le classi Implementazione specifica dei metodi e funzionalità aggiuntive
  • 53.
    57 Classi e metodi«Static» static class TempConverter { public static double CelsiusToFahrenheit(string temperatureCelsius){ double celsius = System.Double.Parse(temperatureCelsius); double fahrenheit = (celsius * 9 / 5) + 32; return fahrenheit; } //... }
  • 54.
  • 55.
    63 Eccezioni static double SafeDivision(doublex, double y) { if (y == 0) throw new System.DivideByZeroException(); return x / y; } Parola chiave per «sollevare» le eccezioni
  • 56.
    64 Eccezioni(2) In questo bloccosi inseriscono le operazioni che si tentano di eseguire 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(); } Istruzioni da eseguire se si verificano Eccezioni di tipo DivideByZeroException Istruzioni da eseguire se si verificano Eccezioni di tipo diverso da DivideByZeroException Operazioni che volgiamo comunque eseguire
  • 57.
  • 58.
    66 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
  • 59.
  • 60.
    68 Delegati(2) public delegate doubleDelegato(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; } }
  • 61.
  • 62.
    70 Eventi(2) class OggettoConEvento { public eventEventHandler 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(); } } {
  • 63.
    71 Operazioni su file •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();
  • 64.
    72 Scrivere e leggeresu file StreamWriter sr = new StreamWriter(fs); sr.Write(text); sr.Close(); Prende come parametro uno Stream o il nome del file Esistono varie modalità di scrittura StreamReader sr = new StreamReader("test.txt"); string res = sr.ReadLine(); sr.Close(); Analogo al Writer
  • 65.
    73 Scrivere e leggeresu file BinaryWriter BinaryReader
  • 66.
  • 67.
    75 Serializzazione C# Serializable] primadella classe Serializable] public class Persona {// classe} NonSerialized] NonSerialized] private string tempCount;
  • 68.
    77 Serializzazione Binaria FileStream fs= new FileStream("Serializzazione.txt", FileMode.OpenOrCreate); File o stream dove salvare l’oggetto BinaryFormatter bf = new BinaryFormatter(); Persona Oggetto per le operazioni di serializzazione Persona)bf.Deserialize(fs); Serializzazione e deserializzazione Chiudi il file
  • 69.
  • 70.
    79 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(); Tipo dell’oggetto che si vuole serializzare • La classe Persona deve implementare un costruttore senza parametri public Persona(string nome, string cognome, string email){} Serializzazione e deserializzazione
  • 71.
    80 Serializzazione XML(3) XmlIgnore()], XmlElement(ElementName ="TaxRate")], • XmlArray("ListaPersona")], [XmlArrayItem("Persona")],