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