Introduzione a c - www3

Transcript

Introduzione a c - www3
Introduzioneal C#
Vittorio Maniezzo
Università di Bologna
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
2
La Common Language Infrastructure
La Common Language Infrastructure (CLI) è una specifica che
permette a diversi linguaggi di programmazione di cooperare
sulla stessa piattaforma
Parti della Common Language Infrastructure:
• Common Intermediate Language (CIL), include un
Common Type System (CTS)
• Common Language Specification (CLS) – condiviso da tutti i
linguaggi
• Virtual Execution System (VES)
• Metadati su tipi, dipendenza da librerie, attributi, ecc.
MONO e .NET sono due implementazioni della Common
Language Infrastructure.
Il linguaggio C# e la Common Language Infrastructure sono
standard proposti da ECMA e ISO
Vittorio Maniezzo – Università di Bologna
3
C# compilazione ed esecuzione
Il Common Language Infrastructure supporta una compilazione in
due fasi
Compilazione
• 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 fra
piattaforme diverse
Vittorio Maniezzo – Università di Bologna
4
C#in confrontoal C
Vittorio Maniezzo – Università di Bologna
5
Operatori
Tabella delle priorità degli operatori C#. Gli operatori di
alto 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 livello
vengono valutati da destra a sinistra o da sinistra a
destra.
Vittorio Maniezzo – Università di Bologna
6
Tabella operatori
LIv.
14
Categoria
Primary
13
Unary
12
11
10
9
8
Multiplicative
Additive
Shift
Relational and Type
testing
Equality
7
6
5
4
3
2
1
0
Logical/bitwise and
Logical/bitwise xor
Logical/bitwise or
Conditional and
Conditional or
Null coalescing
Conditional
Assignment
Operatori
x.y (x) a[x] x++ x-- new typeof checked
unchecked default delegate
+ - ! ~ ++x -x (T)x true false sizeof
* / %
+ << >>
< <= > >= is as
Associativ.
left to right
==
left to right
!=
&
^
|
&&
||
??
?:
= *= /=
%=
+= -= <<= >>=
&= ^= |= =>
left to right
left to right
left to right
left to right
left to right
left to right
left to right
left to right
left to right
left to right
left to right
right to left
right to left
Vittorio Maniezzo – Università di Bologna
7
Input e output
L’output sullo schermo e l’input da tastiera sono gestiti
in 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 a
printf in C
Differenze
• Non c’é il corrispondene di scanf
• Ampio suppoorto alla formattazione di oggetti DateTime
in C#
Vittorio Maniezzo – Università di Bologna
8
Programma: Console output
using 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
9
Programma: Console input
using 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
10
Programma: Console IO demo
L’Input é in bold.
Inserisci un carattere: a Carattere letto: a
Inserisci un integer: 123 Integer letto: 123
Inserisci un double: 456,789 Double letto: 456,789
Vittorio Maniezzo – Università di Bologna
11
Tipi semplici
La maggior parte dei tipi semplici in C# sono simili ai corrispondenti
tipi semplici in C
Principali 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 i
puntatori uguali al C
• Tutti i tipi semplici sono in realtà struct in C#, quindi hanno
dei membri
Vittorio Maniezzo – Università di Bologna
12
Programma: il tipo bool
Un esempio di uso di variabili booleane del loro valore
di 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
13
Programma: il tipo char
Costanti di tipo carattere, notazione esadecimale e metodi della
classe 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
14
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
15
Output programma tipi numerici
sbyte: -128 : 127
byte: 0 : 255
short: -32768 : 32767
ushort: 0 : 65535
int: -2147483648 : 2147483647
uint: 0 : 4294967295
long: -9223372036854775808 : 9223372036854775807
ulong: 0 : 18446744073709551615
float: -3,402823E+38 : 3,402823E+38
double: -1,79769313486232E+308 : 1,79769313486232E+308
decimal: -79228162514264337593543950335 :
79228162514264337593543950335
Vittorio Maniezzo – Università di Bologna
16
Tipi enumerativi
•I tipi enumerativi permettono di associare
nomi simbolici a un sottinsieme di valori
numerici.
•L’utilizzo di tipi enumerativi aumenta la
leggibilità del codice.
•I tipi enumerativi sono analoghi in C e C#
Vittorio Maniezzo – Università di Bologna
17
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
18
Esercizio. Voti ECTS
L'ECTS, introdotto nel 1989 nell'ambito del programma Erasmus,
è il sistema di trasferimento crediti usato in Europa.
ECTS
ITALIA
A (EXCELLENT) 30 LODE
B (VERY GOOD) 28-30
C (GOOD)
25-27
D (SATISFACTORY) 20-24
E (SUFFICIENT) 18-19
F (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 tipo
enumerativo.
Vittorio Maniezzo – Università di Bologna
19
Tipi strutturati
C# 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ù forte
del C riguardo alla definizione dei tipi strutturati
Vittorio Maniezzo – Università di Bologna
20
Array e stringhe
Sia gli array che le stringhe sono degli oggetti in C#
Inoltre, in C# c’è una notazione speciale per array e stringhe
Similarità
• C# e C hanno una sintassi molto simile per array e stringhe
Differenze
• 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
21
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
22
Programma: stringhe
using System;
class ArrayStringDemo2
{ public static void Main()
{ string s1
= "OOP";
System.String s2 = "\u004f\u004f\u0050";//equivalente
Console.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
23
Esercizio. Uso di array
Basandosi sull’esempio di ArrayStringDemo2, scrivere
un codice che dichiara, inizializza e stampa un array di
nomi (cioè array di stringhe), ad esempio quelli di tutti i
membri di un gruppo di interesse.
Ordinate l’array e cercate un nome dato usando il
metodo System.Array.BinarySearch. Infine, invertite
l’array.
Vittorio Maniezzo – Università di Bologna
24
Puntatori e riferimenti
I riferimenti in C# possono essere visti come versione molto
ristretta dei puntatori disponibili in C.
Puntatori
• Nei normali programmi C# i puntatori non vengono
utilizzati
• é possibile dichiarare “unsafe” particolari sezioni del
codice. 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 via
references 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
25
Programma: references
using 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
26
Struct
Le caratteristiche delle struct sono state molto estese in C#
Somiglianze
• Le struct in C# possono esser usate praticamente come le
struct 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 o
classi
Vittorio Maniezzo – Università di Bologna
27
Programma: struct
using 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 Point
public 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
28
Comandi e strutture di controllo
Quasi 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 C
Differenze
• In C# il loop foreach fornisce un modo semplice per iterare
fra tutti gli elementi di una collezione
• try-catch-finally e throw in C# servono a gestire le
eccezioni
• Sono stati introdotte delle istruzioni specializzate:
checked, unchecked, using, lock, yield.
Vittorio Maniezzo – Università di Bologna
29
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
case "one": Console.WriteLine("str is
case "two": Console.WriteLine("str is
default: Console.WriteLine("str is not
}
0");
1");
2");
0, 1
break;
break;
break;
or 2"); break;
}
}
Vittorio Maniezzo – Università di Bologna
30
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
31
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
32
Funzioni
Tutte le funzioni in C# sono membri di classi o struct
C# supporta vari tipi di membri funzionali: metodi, proprietà,
eventi, indexer, operatori, costruttori
Somiglianze
• La modalità generale della definizione e della chiamata delle
funzioni é 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
33
Programma: funzioni semplici
public 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
34
Programma: passaggio di
parametri
using System;
public class ParameterPassing
...
Vittorio Maniezzo – Università di Bologna
35
Programma: overloaded methods
OverloadingDemo
using System;
public class OverloadingDemo
{ public static void Main ()
{ Overloading();
}
...
Vittorio Maniezzo – Università di Bologna
36
Commenti
C# supporta due diversi tipi di commenti, e relative varianti XML
Commenti a riga singola, come in C++
// This is a single-line comment
Commenti 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 di
dichiarazioni, non all’interno di altri frammenti di codice.
I commenti delimitati non possono essere annidati
Vittorio Maniezzo – Università di Bologna
37
C# rispetto a Java
•C# e Java sono molto simili per quanto
riguarda i costrutti di base
•C# ha un numero maggiore di Java di tipi e
operatori.
•Grosse somiglianze generali – le differenze
sono in (molti) dettagli
Vittorio Maniezzo – Università di Bologna
38
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
39
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
40
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 esistono
la inner classe di Java
Array
• C# permette array rettangolari
Metodi virtuali
• C# permette metodi virtuali e non virtuali
Vittorio Maniezzo – Università di Bologna
41
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 2008
Visual Studio
• IDE - Integrated Development Environment
• L’ambiente professionale, commerciale per lo sviluppo in C# e altri
linguaggi di programmazione
Vittorio Maniezzo – Università di Bologna
42
Tools per C# su Unix
Il 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
43
Esercizio. Yahtzee
Yahtzee è un gioco di strategia che si svolge con 5 dadi. Sono previste diverse combinazioni
che ogni giocatore deve realizzare lanciando i dadi. Ottenuta la combinazione, il giocatore
guadagna 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 realizzate
tutte 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 combinazioni
precedenti 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 uguali
Chance (Punteggio = somma dei 5 dadi)
Vittorio Maniezzo – Università di Bologna
44
Esercizio. Yahtzee
Il conteggio dei punti e lo svolgimento del gioco possono essere
annotati in una tabella dove ogni giocatore corrisponde ad una
colonna mentre le combinazioni rappresentano le righe. Ad ogni
turno deve essere utilizzata una casella a scelta, cioè ogni
giocatore deve necessariamente utilizzare una combinazione e
prendere il punteggio ottenuto.
Il programma é per un giocatore singolo, che lancia
ripetutamente i 5 dadi. Niente rilancio dei dadi. Si riempie la riga
che per prima corrisponde alla configurazione ottenuta.
Vittorio Maniezzo – Università di Bologna
45
Oggetti client e oggetti server
Nel gioco dei dadi ogni oggetto agisce, a turno, come
client 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
46
Message Passing
Seguendo una metafora, diciamo che gli oggetti
comunicano 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
47
Classi
Una classe incapsula i dati e le operazioni
collegate e controlla la visibilità sia dei dati che
delle operazioni. Una classe può essere usata
come un tipo del linguaggio di
programmazione
Le parti visibili della classe
costituiscono l’ interfaccia
della classe. Solo questa
viene vista dalle classi client
Vittorio Maniezzo – Università di Bologna
48
Classi in C#
Sintassi:
class-modifiers class class-name
{ variable-declarations
constructor-declarations
method-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 dei
membri
• é il codice di scrittura osato che di solito raccomanda un qualche
particolare ordinamento
Vittorio Maniezzo – Università di Bologna
49
Membri di una classe
I membri più importanti di una classe sono variabili e metodi.
Instance variable
• Definisce uno stato dell’oggetto instanziato
Class variable
• Definisce uno stato comune tutti gi oggetti che istanziano
quella classe
Instance method
• Viene attivato su un oggetto, può lavorare sia su variabili
di istanza che di classe
Class 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 modificatore
static.
Nessun modificatore é richiesto per instance variables e instance
methods.
Vittorio Maniezzo – Università di Bologna
50
Costruttori in C#
Un constructor é un metodo speciale che é richiamato
automaticamente quando si inizializza una nuova istanza della
classe
Costruttori 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
51
Oggetti e classi
Le classi sono completamente definite nei codici sorgente
Gli oggetti sono creati ed esistono solo durante l’esecuzione del
programma
Gli oggetti sono caratterizzati da
• Identità
• Stato
• Comportamento
Tutti gli oggetti cessano di esistere quando l’esecuzione del
programma si conclude.
Vittorio Maniezzo – Università di Bologna
52
Creazione e rilascio di oggetti
Creazione di oggetti
• Istanziazione di classi
• Implicitamente: dichiarando variabili
• Esplicitamente: con comando apposito (new)
• Copiando oggetti già esistenti, cloning
Rilascio di oggetti
• Esplicitamente: con comando apposito (dispose)
• Implicitamente: cancellate automaticamente quando non
vengono più usate, mediante garbage collection
I moderni linguaggi object-oriented supportano la creazione
esplicita degli oggetti e il loro rilascio implicito (attraverso la
garbage collection)
Vittorio Maniezzo – Università di Bologna
53
Inizializazzione di oggetti
Inizializzazione é il processo di assegnazione di valori iniziali alle
instance variables di un oggetto
Inizializzazione 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 inizializzato
correttamente
L’inizializzazione esplicita é di solito preferibile a quella implicita
Conviene inizializzare le instance variables nel costruttore
Vittorio Maniezzo – Università di Bologna
54
Instance Variables
Una instance variable definisce una parte dei
dati nella classe.
Ogni oggetto,creato come istanza della classe,
ha una propria copia delle instance variable.
Vittorio Maniezzo – Università di Bologna
55
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
56
Esercizio. instance variables private
Data la classe BankAccount, creare un conto di backup per ogni
utente in una nuova private instance variable di tipo
BankAccount.
Modificare il metodo Withdraw in modo che, se non
c’éabbastanza denaro nel saldo corrente, allora il prelievo viene
fatto dal conto di backup.
Come esperimento, provate a modificare direttamente il conto
di backup scrivendo: backupAccount.balance -= ...
Funziona? Perché?
Vittorio Maniezzo – Università di Bologna
57
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
58
Programma: messaggi a metodi
BankAccount da una classe client
La chiamata dei metodi corrisponde (nella metafora) all’invio di
messaggi 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
59
L’oggetto corrente: this
L’oggetto corrente durante l’esecuzione di un
programma C# è denotato dalla variabile this
this 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
60
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
61
Programma: BankAccount con una
class variable.
Alla classe BankAccount viene aggiunta la class variable nextAccountNumber,
Che serve a creare un identificativo unico del conto corrente, quando si istanzia la
classe 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
62
Class Method
Un class method é associato con la classe stessa,
non agli oggetti che ne derivano
Un 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
63
Programma: BankAccount con
metodo statico
using System;
using System.Collections;
public class BankAccountStaticMethod
{ private double interestRate;
...
Vittorio Maniezzo – Università di Bologna
64
Classi statiche e classi parziali
Una classe statica class C può avere solo membri statici
Una classe parziale é definita su due o più file sorgente
Classe statica
• Serve come modulo più che come classe
• Impedisce istanziazione, subclassing, instance members.
• Esempi: System.Math, System.IO.File, and
System.IO.Directory
Classi parziali
• Uso: servono a combinare aspetti generali e
specializzazioni successive della stessa classe.
Vittorio Maniezzo – Università di Bologna
65
Costanti e variabili readonly
Le costanti e le variabili readonly hanno valori che non possono
essere modificati durante l’esecuzione
Le 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
66
Programma: uso di costanti e
variabili 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); }
}
Vittorio Maniezzo – Università di Bologna
67