Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna...
Transcript of Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna...
Introduzioneal C#Vittorio Maniezzo
Università di Bologna
Vittorio Maniezzo – Università di Bologna 2
Un pò di storia
C# deriva da precedenti linguaggi object-oriented:Simula (1967)
• Il primo linguaggio object-oriented
C++ (1983)• Il primo linguaggio object-oriented derivato dal C
Java (1995)• Il linguaggio object-oriented della Sun
C# (2001)• Il linguaggio object-oriented della Microsoft
Vittorio Maniezzo – Università di Bologna 3
La Common Language Infrastructure
La Common Language Infrastructure (CLI) è una specifica chepermette a diversi linguaggi di programmazione di cooperaresulla stessa piattaformaParti della Common Language Infrastructure:
• Common Intermediate Language (CIL), include unCommon Type System (CTS)
• Common Language Specification (CLS) – condiviso da tutti ilinguaggi
• Virtual Execution System (VES)• Metadati su tipi, dipendenza da librerie, attributi, ecc.
MONO e .NET sono due implementazioni della CommonLanguage Infrastructure.Il linguaggio C# e la Common Language Infrastructure sonostandard proposti da ECMA e ISO
Vittorio Maniezzo – Università di Bologna4
C# compilazione ed esecuzioneIl Common Language Infrastructure supporta una compilazione indue fasiCompilazione
• Il compilatore C# (csc): Traduzione di sorgente C# in CIL(MSIL)
• Produce file .dll e .exe• Compilazione Just in time : tranduce il CIL in codice macchina
Esecuzione• Inframmezzata da compilazioni Just in Time• su Mono: attivazione esplicita dell’interprete• su Window: attivazione trasparente dell’interprete
I file .dll e .exe sono – salvo piccole limitazioni – portabili frapiattaforme diverse
Vittorio Maniezzo – Università di Bologna 5
C#in confrontoal C
Vittorio Maniezzo – Università di Bologna 6
Operatori
Tabella delle priorità degli operatori C#. Gli operatori dialto livello hanno alta priorità.In una data espressione, gli operatori ad alta prioritàvengono valutati prima di quelli con priorità bassa.L’associatività dice se gli operatori dello stesso livellovengono valutati da destra a sinistra o da sinistra adestra.
Vittorio Maniezzo – Università di Bologna 7
Tabella operatoriLIv. Categoria Operatori Associativ.14 Primary x.y (x) a[x] x++ x-- new typeof checked
unchecked default delegateleft to right
13 Unary + - ! ~ ++x --x (T)x true false sizeof
left to right
12 Multiplicative * / % left to right11 Additive + - left to right10 Shift << >> left to right9 Relational and Type
testing< <= > >= is as left to right
8 Equality == != left to right
7 Logical/bitwise and & left to right6 Logical/bitwise xor ^ left to right5 Logical/bitwise or | left to right4 Conditional and && left to right3 Conditional or || left to right2 Null coalescing ?? left to right1 Conditional ?: right to left0 Assignment = *= /= %= += -= <<= >>= &= ^= |= => right to left
Vittorio Maniezzo – Università di Bologna 8
Input e output
L’output sullo schermo e l’input da tastiera sono gestitiin C# dalla classe Console (progetti Console)L’IO da file é gestito da varie classi Stream in C#Somiglianze
• Console.Write e Console.WriteLine in C# corrispondono aprintf in C
Differenze• Non c’é il corrispondene di scanf• Ampio suppoorto alla formattazione di oggetti DateTime
in C#
Vittorio Maniezzo – Università di Bologna 9
Programma: Console outputusing System;public class OutputDemo{
// Placeholder syntax:{<argument#>[,<width>][:<format>[<precision>]]}
public static void Main(){ Console.Write(“Unformatted number: {0} {1}\n", 1, 1.1);Console.WriteLine("Formatting codes d and f: {0:d} {1:f}",
3, 3.3);...
http://astarte.csr.unibo.it/CorsoCsharp
Vittorio Maniezzo – Università di Bologna 10
Programma: Console inputusing System;public class InputDemo{ public static void Main()
{ Console.Write(“Inserisci un carattere singolo: ");char ch = (char)Console.Read();Console.WriteLine("Carattere letto: {0}", ch);Console.ReadLine();
Console.Write(“Inserisci un integer: ");int i = int.Parse(Console.ReadLine());Console.WriteLine("Integer letto : {0}", i);
Console.Write(“Inserisci un double: ");double d = double.Parse(Console.ReadLine());Console.WriteLine("Double letto : {0:f}", d);
}}
Vittorio Maniezzo – Università di Bologna 11
Programma: Console IO demo
L’Input é in bold.
Inserisci un carattere: a Carattere letto: aInserisci un integer: 123 Integer letto: 123Inserisci un double: 456,789 Double letto: 456,789
Vittorio Maniezzo – Università di Bologna 12
Tipi sempliciLa maggior parte dei tipi semplici in C# sono simili ai corrispondentitipi semplici in CPrincipali differenze:
• Tutti i tipi semplici in C# hanno le dimensioni in bit fisse• C# ha un tipo booleano chiamato bool• In C# i char sono di 16 bit (unicode)• In C# esiste un tipo numerico ad alta precisione su 128 bit
chiamato decimal• I puntatori non sono supportati nell’utilizzo “normale” del C#
• Nelle parti di codice dichiarate “unsafe” il C# permette ipuntatori uguali al C
• Tutti i tipi semplici sono in realtà struct in C#, quindi hannodei membri
Vittorio Maniezzo – Università di Bologna 13
Programma: il tipo bool
Un esempio di uso di variabili booleane del loro valoredi default (false).
using System;class BoolDemo{ public static void Main()
{ bool b1, b2;b1 = true;b2 = default(bool);Console.WriteLine("The value of b2 is {0}", b2);
}}
Vittorio Maniezzo – Università di Bologna 14
Programma: il tipo char
Costanti di tipo carattere, notazione esadecimale e metodi dellaclasse char.using System;class CharDemo{ public static void Main(){
char ch1 = 'à,ch2 = '\u0041', ch3 = '\u00c6',ch4 = '\u00d8', ch5 = '\u00c5',ch6;
Console.WriteLine("ch1 is a letter: {0}", char.IsLetter(ch1));Console.WriteLine("{0} {1} {2}", ch3, ch4, char.ToLower(ch5));
ch6 = char.Parse("B");Console.WriteLine("{0} {1}", char.GetNumericValue('3'),
char.GetNumericValue('à));}
}
Vittorio Maniezzo – Università di Bologna 15
Programma: tipi numerici
Tutti i tipi numerici in C#.Riporta i valori massimi e minimi per ciascun tipo.
using System;using System.Globalization;class NumberDemo{...
}
Vittorio Maniezzo – Università di Bologna 16
Output programma tipi numericisbyte: -128 : 127byte: 0 : 255short: -32768 : 32767ushort: 0 : 65535int: -2147483648 : 2147483647uint: 0 : 4294967295long: -9223372036854775808 : 9223372036854775807ulong: 0 : 18446744073709551615float: -3,402823E+38 : 3,402823E+38double: -1,79769313486232E+308 : 1,79769313486232E+308decimal: -79228162514264337593543950335 :79228162514264337593543950335
Vittorio Maniezzo – Università di Bologna 17
Tipi enumerativi
•I tipi enumerativi permettono di associarenomi simbolici a un sottinsieme di valorinumerici.
•L’utilizzo di tipi enumerativi aumenta laleggibilità del codice.
•I tipi enumerativi sono analoghi in C e C#
Vittorio Maniezzo – Università di Bologna 18
Programma: tipi enumerativi
Definisce i tipi Ranking e OnOff.
using System;class NonSimpleTypeDemo{ public enum Ranking {Bad, OK, Good}
public enum OnOff: byte{On = 1, Off = 0}
public static void Main(){ OnOff status = OnOff.On;
Console.WriteLine();Console.WriteLine("Status is {0}", status);
....foreach(string s in Enum.GetNames(typeof(Ranking)))
Console.WriteLine(s);}
}
Vittorio Maniezzo – Università di Bologna 19
Esercizio. Voti ECTS
L'ECTS, introdotto nel 1989 nell'ambito del programma Erasmus,è il sistema di trasferimento crediti usato in Europa.
ECTS ITALIAA (EXCELLENT) 30 LODEB (VERY GOOD) 28-30C (GOOD) 25-27D (SATISFACTORY) 20-24E (SUFFICIENT) 18-19F (INSUFFICIENT) <18
Esercizio: Definire un tipo enumerativo ECTSGrade con i voti A,B, C, D, E e F e associare 6 voti corrispondenti italiani (30, 29, 26,22, 18, 15).Scrivere un piccolo programma che utilizza il nuovo tipoenumerativo.
Vittorio Maniezzo – Università di Bologna 20
Tipi strutturatiC# permette molti tipi strutturati, il più importante sono le classi(non ci sono in C)Somiglianze
• Array in C#: indicizzati da from 0. Jagged array - array di array• String in C#: Stessa notazione che in C, e stessi escape characters• Struct in C#: un tipo valore, come in C.
Differenze• Array: Esistono gli array rettangolari (multidimensionalli) in C#• String: No terminatore \0 in C#• Struct: Molto più espanse in C#. Le struct posono avere dei metodi.
Nuovi tipi strutturati in C# (rispetto al C):• Classi• Interfacce• Delegates
Essendo un linguaggio object-oriented, il C# è molto più fortedel C riguardo alla definizione dei tipi strutturati
Vittorio Maniezzo – Università di Bologna 21
Array e stringhe
Sia gli array che le stringhe sono degli oggetti in C#Inoltre, in C# c’è una notazione speciale per array e stringheSimilarità
• C# e C hanno una sintassi molto simile per array e stringheDifferenze
• Gli array in C# possono essere multidimensionali o jagged(array di array)
• In C#, un array NON é il puntatore al suo primo elemento• In C# c’é un controllo di indice out of bound• Le stringhe sono immutabili in C#, non in C• In C# ci sono due tipi di stringhe: “una stringa" e @“una
stringa"
Vittorio Maniezzo – Università di Bologna 22
Programma: array in C#.using System;class ArrayStringDemo{ public static void Main(){
string[] a1,a2 = {"a", "bb", "ccc"};
a1 = new string[]{"ccc", "bb", "a"};
int[,] b1 = new int[2,4],b2 = {{1,2,3,4}, {5,6,7,8}};
double[][] c1 = { new double[]{1.1, 2.2},new double[]{3.3, 4.4, 5.5, 6.6} };
Console.WriteLine("Array lengths. a1:{0} b2:{1} c1:{2}",a1.Length, b2.Length, c1.Length);
Array.Clear(a2,0,3);
Array.Resize<string>(ref a2,10);Console.WriteLine("Lenght of a2: {0}", a2.Length);
Console.WriteLine("Sorting a1:");Array.Sort(a1);foreach(string str in a1) Console.WriteLine(str);
}}
Vittorio Maniezzo – Università di Bologna 23
Programma: stringhe
using System;class ArrayStringDemo2{ public static void Main()
{ string s1 = "OOP";System.String s2 = "\u004f\u004f\u0050";//equivalenteConsole.WriteLine("s1 and s2: {0} {1}", s1, s2);string s3 = @"OOP nel \n semestre ""Inf1/SW3""";Console.WriteLine("\n{0}", s3);string s4 = "OOP\n nel \\n semestre \"Inf1/SW3\"";Console.WriteLine("\n{0}", s4);string s5 = "OOP E06".Substring(0,3);Console.WriteLine("The substring is: {0}", s5);
}}
Vittorio Maniezzo – Università di Bologna 24
Esercizio. Uso di array
Basandosi sull’esempio di ArrayStringDemo2, scrivereun codice che dichiara, inizializza e stampa un array dinomi (cioè array di stringhe), ad esempio quelli di tutti imembri di un gruppo di interesse.Ordinate l’array e cercate un nome dato usando ilmetodo System.Array.BinarySearch. Infine, invertitel’array.
Vittorio Maniezzo – Università di Bologna 25
Puntatori e riferimentiI riferimenti in C# possono essere visti come versione moltoristretta dei puntatori disponibili in C.Puntatori
• Nei normali programmi C# i puntatori non vengonoutilizzati
• é possibile dichiarare “unsafe” particolari sezioni delcodice. Qui i puntatori sono utilizzabili circa come in C.
• Unsafe: da usare solo con molta cognizione di causa.Riferimenti (References)
• Gli oggetti (istanze di classi) sono sempre utilizzati viareferences in C#
• Le reference vengono dereferenziate in automatico in C#• Non esiste nessun operatore in C# che lavori direttamente
sulle references
Vittorio Maniezzo – Università di Bologna 26
Programma: referencesusing System;public class C{ public double x, y;}public class ReferenceDemo{ public static void Main()
{ C cRef, anotherCRef;cRef = null;Console.WriteLine("Is cRef null: {0}", cRef == null);
cRef = new C();Console.WriteLine("Is cRef null: {0}", cRef == null);Console.WriteLine("x and y are ({0},{1})", cRef.x, cRef.y);anotherCRef = F(cRef);
}public static C F(C p){ Console.WriteLine("x and y are ({0},{1})", p.x, p.y);return p;
}}
Vittorio Maniezzo – Università di Bologna 27
Struct
Le caratteristiche delle struct sono state molto estese in C#Somiglianze
• Le struct in C# possono esser usate praticamente come lestruct in C
• Le struct sono value types sia in C che in C#Differenze
• Le struct in C# possono avere delle operazioni (metodi),come le classi
• Le struct in C# non possono ereditare da altre struct oclassi
Vittorio Maniezzo – Università di Bologna 28
Programma: structusing System;public struct Point{ public double x, y;
public Point(double x,double y){ this.x=x; this.y=y;}
public void Mirror(){x = -x; y = -y;}
} // end Pointpublic class StructDemo{ public static void Main()
{ Point p1 = new Point(3.0, 4.0),p2;p2 = p1;p2.Mirror();Console.WriteLine(“Il punto è: ({0},{1})",
p2.x,p2.y);}}
Vittorio Maniezzo – Università di Bologna 29
Comandi e strutture di controlloQuasi tutte le strutture di controllo del C sono uguali in C#Somiglianze
• Espressioni, ad es. a = a + 5;• Blocchi, ad es. {a = 5; b = a;}• if, if-else, switch, for, while, do-while, return, break,
continue, and goto in C# sono come in CDifferenze
• In C# il loop foreach fornisce un modo semplice per iterarefra tutti gli elementi di una collezione
• try-catch-finally e throw in C# servono a gestire leeccezioni
• Sono stati introdotte delle istruzioni specializzate:checked, unchecked, using, lock, yield.
Vittorio Maniezzo – Università di Bologna 30
Programma: switch.
using System;class SwitchDemo{ public static void Main()
{ int j = 1, k = 1;
…
string str = "two";switch (str){case "zero": Console.WriteLine("str is 0"); break;case "one": Console.WriteLine("str is 1"); break;case "two": Console.WriteLine("str is 2"); break;default: Console.WriteLine("str is not 0, 1 or 2"); break;
}}
}
Vittorio Maniezzo – Università di Bologna 31
Programma: foreach
using System;class ForeachDemo{ public static void Main()
{ int[] ia = {1, 2, 3, 4, 5};int sum = 0;
foreach(int i in ia)sum += i;
Console.WriteLine(sum);}
}
Vittorio Maniezzo – Università di Bologna 32
Programma: try catch
using System;class TryCatchDemo{ public static void Main()
{ int i = 5, r = 0, j = 0;
try{ r = i / j;
Console.WriteLine("r vale {0}", r);}catch(DivideByZeroException e){ Console.WriteLine("r non può essere calcolato");}
}}
Vittorio Maniezzo – Università di Bologna 33
FunzioniTutte le funzioni in C# sono membri di classi o structC# supporta vari tipi di membri funzionali: metodi, proprietà,eventi, indexer, operatori, costruttoriSomiglianze
• La modalità generale della definizione e della chiamata dellefunzioni é la stessa in C e C#
Differenze• Molti modi diversi di passaggio di parametri in C#
• Per valore. Solo input. Nessun modifier.• Per indirizzo (by reference). input e output o solo output
• Input e output: modifier ref• Solo output: modifier out
• Funzioni con un numero variabile di parametri di input in C#• Overloading di funzioni in C#• Delegates in C#
Vittorio Maniezzo – Università di Bologna 34
Programma: funzioni semplicipublic class FunctionDemo{ public static void Main ()
{ SimpleFunction();}
public static void SimpleFunction(){ int i = 5,
j = Increment(i);Console.WriteLine("i and j: {0}, {1}", i, j);
}
public static int Increment(int i){ return i + 1;}
}
Vittorio Maniezzo – Università di Bologna 35
Programma: passaggio diparametri
using System;public class ParameterPassing...
Vittorio Maniezzo – Università di Bologna 36
Programma: overloaded methods
OverloadingDemo
using System;public class OverloadingDemo{ public static void Main (){ Overloading();}
...
Vittorio Maniezzo – Università di Bologna 37
Commenti
C# supporta due diversi tipi di commenti, e relative varianti XMLCommenti a riga singola, come in C++// This is a single-line commentCommenti delimitati, come in C/* This is a delimited comment */Commenti a linea singola in XML:/// <summary> This is a single-line XML comment </summary>Commenti delimitati in XML :/** <summary> This is a delimited XML comment </summary> */
I commenti XML possono solo essere inseriti prima didichiarazioni, non all’interno di altri frammenti di codice.I commenti delimitati non possono essere annidati
Vittorio Maniezzo – Università di Bologna 38
C# rispetto a Java
•C# e Java sono molto simili per quantoriguarda i costrutti di base
•C# ha un numero maggiore di Java di tipi eoperatori.
•Grosse somiglianze generali – le differenzesono in (molti) dettagli
Vittorio Maniezzo – Università di Bologna 39
Tipi
Somiglianze.• Classi sia in C# che in Java• Interfacce sia in C# che in Java
Differenze.• Structs in C#, non in Java• Delegates in C#, non in Java• Tipi Nullable in C#, non in Java• Tipi enumerativi complessi in Java; più semplici in C#
Vittorio Maniezzo – Università di Bologna 40
Operazioni
Somiglianze: Operazioni sia in Java che in C#• Metodi
Differenze: Operazioni solo in C#• Proprietà• Indexers• Overloaded operators• Metodi anonimi
Vittorio Maniezzo – Università di Bologna 41
Altre differenze
Struttura del programma• Nessuna particolare richiesta di organizzazione dei file
sorgente in C#Eccezioni
• Non é richiesto un catch o uno specify in C#Classi locali e innestate
• Classi interne alle classi sono statiche in C#: Non esistonola inner classe di Java
Array• C# permette array rettangolari
Metodi virtuali• C# permette metodi virtuali e non virtuali
Vittorio Maniezzo – Università di Bologna 42
Tools per C# su Windows
Microsoft fornisce vari tool di supporto alla programmazione C#.NET Framework SDK 3.5
• "Software Development Kit"• Command line tools, come il compilatore csc
Visual C# Express• IDE - Integrated Development Environment• A é una versione specializzata, gratuita del C# nel Microsoft Visual
Studio 2008Visual Studio
• IDE - Integrated Development Environment• L’ambiente professionale, commerciale per lo sviluppo in C# e altri
linguaggi di programmazione
Vittorio Maniezzo – Università di Bologna 43
Tools per C# su UnixIl progetto MONO fornisce strumenti per la programmazione in C#su Linux, Solaris, Mac OS X, Windows e Unix.MONO
• Un progetto open source (sponsorizzato da Novell)• Corrisponde al SDK di Microsoft• Basato sulle specifiche ECMA del C# e della Common
Language Infrastructure (CLI)• Tool a llinea di comando• Compilatori: mcs (C# 1.5) e gmcs (C# 2.0)
MONO sulla propria macchina Linux• Facile da installarsi da soli
MonoDevelop• Una GNOME IDE per C#
MONO non é aggiornato all’ultima release del framework MS
Vittorio Maniezzo – Università di Bologna 44
Esercizio. YahtzeeYahtzee è un gioco di strategia che si svolge con 5 dadi. Sono previste diverse combinazioniche ogni giocatore deve realizzare lanciando i dadi. Ottenuta la combinazione, il giocatoreguadagna il punteggio previsto per essa. Una combinazione non può essere ripetuta; quindi,il gioco termina dopo 13 turni di lancio dei dadi, anche quando non sono state realizzatetutte le combinazioni. Vince il giocatore che ha totalizzato il maggior numero di punti.Combinazioni Dadi Uguali con 1 (Punteggio = somma dei dadi con 1)Dadi Uguali con 2 (Punteggio = somma dei dadi con 2)Dadi Uguali con 3 (Punteggio = somma dei dadi con 3)Dadi Uguali con 4 (Punteggio = somma dei dadi con 4)Dadi Uguali con 5 (Punteggio = somma dei dadi con 5)Dadi Uguali con 6 (Punteggio = somma dei dadi con 6)Bonus (Punteggio = 35): si ottiene se la somma dei punteggi per le 6 combinazioniprecedenti supera 62.Scala con 4 (Punteggio = 30)Scala con 5 (Punteggio = 40)Tre dadi uguali (Punteggio = somma dei 5 dadi)Quattro dadi uguali (Punteggio = somma dei 5 dadi)Full (Punteggio = 25): come Poker, 3 dadi di un tipo e due di un altro.Yahtzee (Punteggio = 50): si ottiene con 5 dadi ugualiChance (Punteggio = somma dei 5 dadi)
Esercizio. Yahtzee
Il conteggio dei punti e lo svolgimento del gioco possono essereannotati in una tabella dove ogni giocatore corrisponde ad unacolonna mentre le combinazioni rappresentano le righe. Ad ogniturno deve essere utilizzata una casella a scelta, cioè ognigiocatore deve necessariamente utilizzare una combinazione eprendere il punteggio ottenuto.Il programma é per un giocatore singolo, che lanciaripetutamente i 5 dadi. Niente rilancio dei dadi. Si riempie la rigache per prima corrisponde alla configurazione ottenuta.
Vittorio Maniezzo – Università di Bologna 45
Vittorio Maniezzo – Università di Bologna 46
Oggetti client e oggetti server
Nel gioco dei dadi ogni oggetto agisce, a turno, comeclient e come server.
Client e server• L’oggetto Game é un client di più oggetti Die• Ogni oggetto Die é un cliente di un oggetto Random• A turno, un oggetto Die fa da server a un oggetto Game e
l’oggetto Random fa da server per gli oggetti Die
Vittorio Maniezzo – Università di Bologna 47
Message Passing
Seguendo una metafora, diciamo che gli oggetticomunicano attraverso uno scambio di messaggi
Scambio di messaggi• L’interazione fra oggetti viene descritta come uno scambio
di messaggi.• L’oggetto che riceve il messaggio trova la procedura che
può rispondere al messaggio: method lookup• é possibile inviare un risultato dal ricevente al mittante del
messaggio originario.
Vittorio Maniezzo – Università di Bologna 48
ClassiUna classe incapsula i dati e le operazionicollegate e controlla la visibilità sia dei dati chedelle operazioni. Una classe può essere usatacome un tipo del linguaggio diprogrammazioneLe parti visibili della classecostituiscono l’ interfacciadella classe. Solo questaviene vista dalle classi client
Vittorio Maniezzo – Università di Bologna 49
Classi in C#Sintassi:class-modifiers class class-name{ variable-declarations
constructor-declarationsmethod-declarations
}Membri: gli elementi costitutivi di una classe si chiamano membri
• Variabili, costruttori, metodi• Altri tipi di membri descritti in seguito
Visibilità: i membri possono essere privati o pubblici• La visibilità di default é private
Ordinamento: non é richiesto nessun particolare ordinamento deimembri
• é il codice di scrittura osato che di solito raccomanda un qualcheparticolare ordinamento
Vittorio Maniezzo – Università di Bologna 50
Membri di una classeI membri più importanti di una classe sono variabili e metodi.Instance variable
• Definisce uno stato dell’oggetto instanziatoClass variable
• Definisce uno stato comune tutti gi oggetti che istanzianoquella classe
Instance method• Viene attivato su un oggetto, può lavorare sia su variabili
di istanza che di classeClass method
• Viene attivato attraverso la classe, non le sue istanze. Puòlavorare solo su variabili di classe
Class variables e class methods sono definiti con il modificatorestatic.Nessun modificatore é richiesto per instance variables e instancemethods.
Vittorio Maniezzo – Università di Bologna 51
Costruttori in C#Un constructor é un metodo speciale che é richiamatoautomaticamente quando si inizializza una nuova istanza dellaclasseCostruttori in C#
• Hanno lo stesso nome della classe cui appartengono• Non ritornano nessun valore• Spesso sono overloaded, spesso ci sono diversi costruttori
per la stessa classe, con parametri diversi• Se non vengono definiti costruttori espliciti, c’é comunque
un costruttore di default senza parametri.• Se ci sono costruttori espliciti, il costruttore di default
senza parametri non é attivabile
Vittorio Maniezzo – Università di Bologna 52
Oggetti e classi
Le classi sono completamente definite nei codici sorgenteGli oggetti sono creati ed esistono solo durante l’esecuzione delprogrammaGli oggetti sono caratterizzati da
• Identità• Stato• Comportamento
Tutti gli oggetti cessano di esistere quando l’esecuzione delprogramma si conclude.
Vittorio Maniezzo – Università di Bologna 53
Creazione e rilascio di oggetti
Creazione di oggetti• Istanziazione di classi
• Implicitamente: dichiarando variabili• Esplicitamente: con comando apposito (new)
• Copiando oggetti già esistenti, cloningRilascio di oggetti
• Esplicitamente: con comando apposito (dispose)• Implicitamente: cancellate automaticamente quando non
vengono più usate, mediante garbage collectionI moderni linguaggi object-oriented supportano la creazioneesplicita degli oggetti e il loro rilascio implicito (attraverso lagarbage collection)
Vittorio Maniezzo – Università di Bologna 54
Inizializazzione di oggetti
Inizializzazione é il processo di assegnazione di valori iniziali alleinstance variables di un oggettoInizializzazione di oggetti di tipo T
• Attraverso i valori di default di T• zero per tipi numerici, false per bool, '\x0000' per char,
null per reference types• Attraverso un initializer• Attraverso metodi specifici chiamati constructors
é indispensabile che ogni nuovo oggetto sia inizializzatocorrettamenteL’inizializzazione esplicita é di solito preferibile a quella implicitaConviene inizializzare le instance variables nel costruttore
Vittorio Maniezzo – Università di Bologna 55
Instance Variables
Una instance variable definisce una parte deidati nella classe.Ogni oggetto,creato come istanza della classe,ha una propria copia delle instance variable.
Vittorio Maniezzo – Università di Bologna 56
Programma: BankAccount
Instance variables nella classeBankAccount.public class BankAccount{ private double interestRate;
private string owner;…
Programma: Creazione di due conti correnti.using System;public class BankAccountClient{ public static void Main()
{ BankAccount a1 = new BankAccount("Andrea", 0.02),a2 = new BankAccount("Bruno", 0.03);
a1.Deposit(100.0M);a2.Deposit(1000.0M); a2.AddInterests();Console.WriteLine(a1); // 100 €Console.WriteLine(a2); // 1030 €
}}
Vittorio Maniezzo – Università di Bologna 57
Esercizio. instance variables private
Data la classe BankAccount, creare un conto di backup per ogniutente in una nuova private instance variable di tipoBankAccount.Modificare il metodo Withdraw in modo che, se nonc’éabbastanza denaro nel saldo corrente, allora il prelievo vienefatto dal conto di backup.Come esperimento, provate a modificare direttamente il contodi backup scrivendo: backupAccount.balance -= ...Funziona? Perché?
Vittorio Maniezzo – Università di Bologna 58
Metodi Instance
Un instance method é un metodo in una classe che puòleggere o modificare una o più instance variables.Un instance method M in una classe C
• Deve essere attivatp da un oggetto che sia una istanza di C• Viene attivato da object.M(...) da fuori C• Viene attivato da this.M(...) o solo M(...) all’interno di C• Può accedere a tutti i membri di C
Vittorio Maniezzo – Università di Bologna 59
Programma: messaggi a metodiBankAccount da una classe client
La chiamata dei metodi corrisponde (nella metafora) all’invio dimessaggi dal Main ai diversi oggetti bank account.
using System;public class BankAccountClient{ public static void Main(){
BankAccount a1 = new BankAccount(“Andrea", 0.02),a2 = new BankAccount(“Bruno", 0.03),a3 = new BankAccount(“Carla", 0.02);
a1.Deposit(100.0M);a2.Deposit(1000.0M); a2.AddInterests();a3.Deposit(3000.0M); a3.AddInterests();
...
Vittorio Maniezzo – Università di Bologna 60
L’oggetto corrente: this
L’oggetto corrente durante l’esecuzione di unprogramma C# è denotato dalla variabile thisthis viene usato in diverse situazioni:
• Riferimento a instance variables nascoste• Attivazione di costruttori• Definizione di indexers• Definizione di extension methods
Vittorio Maniezzo – Università di Bologna 61
Class Variables
Una class variable appartiene alla classe ed écondivisa da tutte le istanze della classe.Class variables
• Sono dichiarate usando il modificatore static• Possono essere viste come variabili globali
associate alla classe data• Tipicamente contengono metainformazioni sulla
classe, es. numero di istanze, …
Vittorio Maniezzo – Università di Bologna 62
Programma: BankAccount con unaclass variable.
Alla classe BankAccount viene aggiunta la class variable nextAccountNumber,Che serve a creare un identificativo unico del conto corrente, quando si istanzia laclasse BankAccount.using System;public class BankAccount{ private double interestRate;
private string owner;private decimal balance;private long accountNumber;private static long nextAccountNumber = 0;public BankAccount(string owner){ nextAccountNumber++;
this.accountNumber = nextAccountNumber; this.interestRate = 0.0;this.owner = owner; this.balance = 0.0M;
}public BankAccount(string owner, double interestRate){ nextAccountNumber++;
this.accountNumber = nextAccountNumber; this.interestRate=interestRate;this.owner = owner; this.balance = 0.0M;
}
Vittorio Maniezzo – Università di Bologna 63
Class Method
Un class method é associato con la classe stessa,non agli oggetti che ne derivanoUn class method M della classe C
• Viene dichiarato usando il modificatore static• Può accedere solo a membri statici della classe• Deve essere attivato sulla classe stessa• é invocato scrivendo C.M(...) da fuori C• é invocato scrivendo M(...) all’interno di C
Vittorio Maniezzo – Università di Bologna 64
Programma: BankAccount conmetodo statico
using System;using System.Collections;public class BankAccountStaticMethod{ private double interestRate;...
Vittorio Maniezzo – Università di Bologna 65
Classi statiche e classi parziali
Una classe statica class C può avere solo membri staticiUna classe parziale é definita su due o più file sorgenteClasse statica
• Serve come modulo più che come classe• Impedisce istanziazione, subclassing, instance members.• Esempi: System.Math, System.IO.File, and
System.IO.DirectoryClassi parziali
• Uso: servono a combinare aspetti generali especializzazioni successive della stessa classe.
Vittorio Maniezzo – Università di Bologna 66
Costanti e variabili readonlyLe costanti e le variabili readonly hanno valori che non possonoessere modificati durante l’esecuzioneLe costanti sono dichiarete con il letterale const
• Calcolate a compile-time• Devono essere inizializzate esplicitamente• L’initializzazione é valutata a compile time• Non viene allocato heap o stack per le constants• Devono essere di tipo semplice, stringhe, o reference type
Le variabili readonly sono dichiarate con il modificatore readonly• Calcolate nel momento dell’instaziazione dell’oggetto• Devono essere inizializzate o esplicitamente o nel
costruttore della classe• Non possono essere modificate in altre parti del
programma
Vittorio Maniezzo – Università di Bologna 67
Programma: uso di costanti evariabili readonly
class ConstDemo{ const double ca = 5.0,
cb = ca + 1;private readonly double roa = 7.0, rob = Math.Log(Math.E);private readonly BankAccount roba = new BankAccount("Andrea");
public ConstDemo() // CONSTRUCTOR{ roa = 8.0;roba = new BankAccount("Tim");
}public static void Main(){ ConstDemo self = new ConstDemo();self.Go();
}public void Go(){ roba.Deposit(100.0M); }
}