Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna...

34
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

Transcript of Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna...

Page 1: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 2: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 3: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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.

Page 4: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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#

Page 5: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

}}

Page 6: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 7: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

}

Page 8: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 9: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

}

Page 10: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 11: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

}}

Page 12: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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.

Page 13: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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;

}}

Page 14: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 15: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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;

}}

}

Page 16: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

}}

Page 17: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

}

Page 18: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

...

Page 19: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 20: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 21: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 22: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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)

Page 23: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 24: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 25: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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.

Page 26: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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.

Page 27: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 28: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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 €

}}

Page 29: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 30: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 31: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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;

}

Page 32: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 33: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

Page 34: Introduzioneal C#isi-personale.csr.unibo.it/vittorio.maniezzo/did... · Università di Bologna Vittorio Maniezzo– Università di Bologna 2 Un pò di storia C# deriva da precedenti

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

}