Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i...

43
Il linguaggio C# Introduzione e tipi di dato Tecniche di Programmazione avanzata Corso di Laurea Specialistica in Ingegneria Telematica Università Kore – Enna – A.A. 2009-2010 Alessandro Longheu http://www.diit.unict.it/users/alongheu [email protected] 2 A. Longheu – Tecniche di programmazione avanzata Origini di C# C# was developed by Anders Hejlsberg and Scott Wiltamuth. Hejlsberg is also known for creating Turbo Pascal, a popular language for PC programming, and for leading the team that designed Borland Delphi, one of the first successful IDE for client/server programming. The goal of C# is to provide a simple, safe, modern, object-oriented, Internet-centric, high-performance language for .NET development You learn C# specifically to create .NET applications; pretending otherwise would miss the point of the language.

Transcript of Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i...

Page 1: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

Il linguaggio C#

Introduzione e tip

i di dato

Tecniche di Programmazione avanzata

Corso d

i Laurea S

pecialistica in

Ingegneria T

elematica

Università

Kore –

Enna –

A.A. 2

009-2010

Alessa

ndro Lo

ngheu

http

://www.diit.u

nict.it/u

sers/alongheu

alessandro.lon

[email protected]

nict.it

2

A. Longheu –Tecniche di programmazione avanzata

Orig

ini d

i C#

�C# was

developed by

Anders

Hejlsb

erg and Scott

Wilta

muth.

�Hejlsb

erg is

also

known for cre

atin

g T

urbo Pasca

l, a

popular la

nguage fo

r PC programming, a

nd fo

r leading

the te

am th

at d

esig

ned Borla

nd Delphi, o

ne of th

e first

succe

ssful ID

E fo

r client/se

rver p

rogramming.

�The goal o

f C# is to

provid

e a sim

ple, sa

fe, m

odern,

object-o

riented, Internet-centric

, high-perfo

rmance

language fo

r .NET development

�You

learn

C# specifically to create .NET

applications; pretending otherw

ise would miss

the

point o

f the language.

Page 2: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

3

A. Longheu –Tecniche di programmazione avanzata

�Inizia

lmente, M

icrosoft su

pporta

vaJava

�Poi,

cifu una

litegiudizia

riacon Sun, poich

éMicro

soft

voleva

aggiungere

classi

e fe

atures sp

ecifich

eper W

indows

(motivi

diperfo

rmance)

�Micro

soft p

erse

la ca

usa, in

diabbandonòJava in

Internet

Explorer 6

la JV

M M

icrosoft n

on è

più

insta

llata

per d

efault,

e co

munquesupporta

solo fin

oa Ja

va 1.1.4

�C# è

illinguaggio

“simil-Ja

va”cheMicro

soft h

a in

trodotto

dopotale evento,e .NET èl’in

frastru

ttura chefa

le veci

della

Java Platfo

rm

Orig

ini d

i C#

4

A. Longheu –Tecniche di programmazione avanzata

C# -Arch

itettu

ra

�L’a

rchitettu

raè“sim

il-Java”, co

n alcu

nediffe

renze

Ja

va

pla

tform

Ja

va

pla

tform

C# e

.NE

TC

# e

.NE

T

Com

pila

tore

C# –

pro

duce u

n

form

ato

(MS

IL) p

orta

bile

per .N

ET

Com

pila

tore

C# –

pro

duce u

n

form

ato

(MS

IL) p

orta

bile

per .N

ET

Com

pila

tore

Ja

va –

pro

duce

byte

code

(.cla

ss) p

orta

bile

Com

pila

tore

Ja

va –

pro

duce

byte

code

(.cla

ss) p

orta

bile

Com

pila

tore

JIT

(pro

duce .e

xe p

er

pia

ttafo

rma

CL

R –

richie

de

.NE

T

Fra

me

work

sulsis

tem

a)

Com

pila

tore

JIT

(pro

duce .e

xe p

er

pia

ttafo

rma

CL

R –

richie

de

.NE

T

Fra

me

work

sulsis

tem

a)

Inte

rpre

teJava

(pla

tform

depe

ndent)

-in

realtà

op

era

com

e c

om

pila

tore

JIT

Inte

rpre

teJava

(pla

tform

depe

ndent)

-in

realtà

op

era

com

e c

om

pila

tore

JIT

Com

mon L

ang

uage R

untim

e (C

LR

):

quan

do

siric

hie

de

l’esecuzio

ne

diun

.exe d

i.N

ET

, attiv

ail

com

pila

tore

JIT

che

traduce M

SIL

in c

odic

e

nativ

oe p

oi lo

esegu

e

Com

mon L

ang

uage R

untim

e (C

LR

):

quan

do

siric

hie

de

l’esecuzio

ne

diun

.exe d

i.N

ET

, attiv

ail

com

pila

tore

JIT

che

traduce M

SIL

in c

odic

e

nativ

oe p

oi lo

esegu

e

nessun

ostra

toem

bedd

ed n

el

sis

tem

aopera

tivo

nessun

ostra

toem

bedd

ed n

el

sis

tem

aopera

tivo

Page 3: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

5

A. Longheu –Tecniche di programmazione avanzata

Arch

itettu

re a co

nfro

nto

Siste

ma operativo

Codice

.exe

Codice

MSIL

Codice

byte

code

Codice

sorgente

Compilatore

classico

Codice

sorgente

Compilatore

.NET

Codice

sorgente

Compilatore

Java

Applica

zione

standard

Form

ato sp

ecifico

del S

O

Applica

zione .N

ET

CLR

di .N

ET

Compilatore ju

st in

time

Applica

zione Ja

va

Java virtu

almachine

6

A. Longheu –Tecniche di programmazione avanzata

Convenzio

nie Stru

menti

�Ancheilprocesso

disvilu

ppoè“sim

il-Java”, co

n alcu

neimporta

ntidiffe

renze:

Ja

va p

latfo

rmJa

va p

latfo

rmC

# e

.NE

TC

# e

.NE

T

nessun

vin

colo

esplic

itonessun

vin

colo

esplic

itoO

gnicla

sse

pu

bblic

adeve

sta

re

in u

n file

om

onim

o.ja

va

Ognicla

sse

pu

bblic

adeve

sta

re

in u

n file

om

onim

o.ja

va

Il com

pila

tore

csc

pro

duce il

file

MS

IL .e

xe c

orris

pond

ente

Il com

pila

tore

csc

pro

duce il

file

MS

IL .e

xe c

orris

pond

ente

Il com

pila

tore

javac

pro

duce il

file .c

lass c

orris

pond

ente

Il com

pila

tore

javac

pro

duce il

file .c

lass c

orris

pond

ente

Pre

req

uis

itop

er l’e

secu

zio

ne:

.NE

T F

ram

ew

ork

(Red

istrib

uta

ble

o S

DK

) insta

llato

sulsis

tem

a

Pre

req

uis

itop

er l’e

secu

zio

ne:

.NE

T F

ram

ew

ork

(Red

istrib

uta

ble

o S

DK

) insta

llato

sulsis

tem

a

Pre

req

uis

itop

er l’e

secu

zio

ne:

jre(J

ava 2

Ru

ntim

e E

nviro

nm

ent)

insta

llato

sulsis

tem

a

Pre

req

uis

itop

er l’e

secu

zio

ne:

jre(J

ava 2

Ru

ntim

e E

nviro

nm

ent)

insta

llato

sulsis

tem

a

Lo s

trato

Com

mon L

an

gua

ge

Runtim

e

(CLR

) attiv

ail

com

pila

tore

JIT

che

traduce il

“finto

exe”

MS

IL in

codic

en

ativ

o, e

lo e

seg

ue

al v

olo

Lo s

trato

Com

mon L

an

gua

ge

Runtim

e

(CLR

) attiv

ail

com

pila

tore

JIT

che

traduce il

“finto

exe”

MS

IL in

codic

en

ativ

o, e

lo e

seg

ue

al v

olo

L’in

terp

rete

java in

terp

reta

ilfile

.cla

ss (o

.jar) s

opra

ge

nera

to

L’in

terp

rete

java in

terp

reta

ilfile

.cla

ss (o

.jar) s

opra

ge

nera

to

Page 4: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

7

A. Longheu –Tecniche di programmazione avanzata

Caratte

ristichediC#

1.E’orie

ntato

aglioggetti

2.Component-o

rientatio

n3.Softw

are ro

busto

4.Mantenimento

degliinvestim

enti

8

A. Longheu –Tecniche di programmazione avanzata

Object

orie

nted

�Ognicosa

èun oggetto

�I tip

i prim

itividiJava

non so

nooggetti

(sonospecia

li) e non in

teragisco

nocon glioggetti

�I tip

i prim

itividiSmallta

lk, Lisp

sono

oggetti

ma

hannoqualch

eproblemadiperfo

rmance

�C# tra

ttai tip

i prim

itivicome oggetti

senza

problemidi

perfo

rmance

�Migliore

este

ndibilità

e riu

tilizzabilità

del co

dice

�Nuovitip

i prim

itivi: Decim

al, S

QL…

�Classi

come Collectio

ns

Page 5: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

9

A. Longheu –Tecniche di programmazione avanzata

Componentorie

nted

�C# èilprim

o linguaggio

della

“famiglia

C”Component-

Orie

nted

�Cos’è

un co

mponente?

�Un m

odulo in

dipendente

(reuse e deploym

ent)

�Minor

Granularita

degli

oggetti

(gli

oggetti

sono

costru

ttilinguistici)

�Posso

no in

cludere più

classi

�Spesso

language-in

dependent

�Svilu

ppo

e uso

del componente

non necessita

no

di

nessu

nainterazio

ne

10

A. Longheu –Tecniche di programmazione avanzata

�I co

mponentisonosupporta

tidallinguaggio

�Proprie

tà,metodied eventi

�Attrib

utidesig

n tim

e e ru

ntim

e�Documentazio

neintegrata

XML

�Tutto

in un file

�Nessu

nfile

diheader, ID

L, etc.

�Dich

iarazio

need im

plementazio

necoincid

ono

�Può

esse

reutilizza

toin

pagine

ASP.NET

(autosufficie

nti)

Componentorie

nted

Page 6: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

11

A. Longheu –Tecniche di programmazione avanzata

Softw

are ro

busto

e fa

cile

manutenzio

nedel so

ftware

�Garbage co

llectio

n�Fine deimemory le

aks (co

nsumo non vo

luto di m

emoria

dovuto alla mancata deallocazio

ne dalla memoria

di

varia

bili/d

ati n

on più

utilizza

ti da parte

dei p

rocessi) e

deipuntatoripendenti

�Ecce

zioni

�Type sa

fety

�Non ci

sonovaria

bilinon in

izializza

te�lim

itialle

operazio

nidicast

(no unsafe ca

st) �

Versio

ning

�Supporto

del ve

rsioning

12

A. Longheu –Tecniche di programmazione avanzata

Caratte

ristichediC#

�Supporto

per in

terfa

ccee ereditarie

tàsin

gola

�Glioggetti

nell’h

eapsonogestiti

dalgarbage co

llecto

r�

Esponemetadata co

me attrib

uti

�Intro

duce tip

i delegate e eventi

�I p

arametri d

ei m

etodi d

evono esse

re labellati in

/out/re

f�

Le cla

ssi posso

no avere un distru

ttore co

me in

C++

�Il rila

scio esplicito

delle riso

rse è

gestito

attra

verso

le in

terfa

cce�

Miglior co

ntro

llo dei n

omi

�Consente l’o

verlo

ading degli o

peratori

�Gli a

rrays p

osso

no esse

re m

ultid

imensio

nali

�Sono co

nsentiti a

lias p

er i tip

i�

E’supporta

ta la documentazio

ne XML

�E’consentito

l’acce

sso alla m

emoria

attra

verso

i puntatori (u

nsafe m

ode)

�E’supporta

ta una preprocesso

r-like syn

tax

�E’possib

ile acce

dere a fu

nzio

ni este

rne m

emorizza

te co

me dll

�Interoperabilità

(con XML, S

OAP, C

OM, D

LL e qualsia

si linguaggio di .N

ET)

�Esiste

molto

codice

C# in

.NET, q

uindi b

assa

curva

di apprendimento

Page 7: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

13

A. Longheu –Tecniche di programmazione avanzata

C# and Ja

va

�Java è

esse

nzia

lmente

un su

bset d

iC#

con quattro

importa

ntidiffe

renze:

�Throws cla

use on m

ethods

�Inner cla

sses

�Thread syn

chroniza

tion

�Class lo

ading

14

A. Longheu –Tecniche di programmazione avanzata

C# and Ja

va (co

nt.)

�Inner cla

sses in

C# so

nogestite

come namespace, lo

sta

todeve

esse

repassa

toesplicita

mente

come

argomento

�I Threads sono

resi

disp

onibili

attra

verso

la cla

sseMonito

r

�Il m

odello

diClass lo

ading ha la ste

ssa espressività

�C# e

CLR

sonosta

te progetta

teinsie

mema so

nodue

elementi

separati

quindile loro

funzio

nalita

sono

meglio

separabilichetra

Java/JV

M

Page 8: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

15

A. Longheu –Tecniche di programmazione avanzata

C# and Ja

va (co

nt.)

�C# perm

ette

didefin

irepiù

classi

all’in

terno

dello

stesso

file: l’u

nità

disvilu

ppoèl’Asse

mbly

�I tip

i sonoorganizza

tiin namespaces ch

esono

similiaipacka

ges Ja

va

�Namespaces so

nodefin

iticome blocch

iall’in

iziodelfile

�Un sin

golo

file può

contenere

defin

izioniche

riguardanodiffe

rentinamespaces

16

A. Longheu –Tecniche di programmazione avanzata

Il Linguaggio C#

Sintattica

mente, è

un “q

uasi-clo

ne”diJava…

�…con aggiunte

diC++

�overlo

ading deglioperatori

�operatoridiconversio

neditip

o�

…dialcu

ninuoviconcetti

�lette

rali“ve

rbatim

”�proprie

tà, in

dicizza

tori

�…

e altri

più

"discu

tibili"

�passa

ggioper rife

rimento

(ancheper tip

i prim

itivi)�codice

“non gestito

”, puntatori

�Le m

aggioridiffe

renze

sintattich

erig

uardanola sco

mparsa

delle

keyw

ords e

xtends e

implements

non presentiin C#

�packa

ge si

trasfo

rmain namespace

�C# adotta

le co

nvenzio

niPasca

l (inizia

lemaiusco

la)

Page 9: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

17

A. Longheu –Tecniche di programmazione avanzata

Il Linguaggio C#: C

onvenzio

ni

�In Ja

va:

�i p

acka

ge hannonomicon in

izialeminusco

la

�le cla

ssihannonomicon in

izialemaiu

scola

�i m

etodihannonomicon in

izialeminusco

la

�le va

riabilihannonomicon in

izialeminusco

la

�In C#:

�i n

amespace hannonomicon in

izialemaiu

scola

�le cla

ssihannonomicon in

izialemaiu

scola

�i m

etodihannonomicon in

izialemaiu

scola

�le va

riabilihannonomicon in

izialemaiu

scola

18

A. Longheu –Tecniche di programmazione avanzata

ESEMPIO

In J

ava:

pu

blic

cla

ss E

sem

pio

{

pu

blic

sta

tic v

oid

main

(Strin

garg

s[]){

Syste

m.o

ut.p

rintln

("Hello

Wo

rld");

}In C

#:

cla

ss E

se

mp

io{

sta

tic v

oid

Ma

in(){

Syste

m.C

on

so

le.W

riteL

ine("H

ello

Wo

rld");

}

main

/ prin

t / prin

tlnM

ain

/ Write

/ Write

Lin

earg

om

en

tid

el m

ain

ob

blig

ato

riarg

om

en

tid

el

main

faco

ltativ

i

main

/ prin

t / prin

tlnM

ain

/ Write

/ Write

Lin

e

arg

om

en

tid

el m

ain

ob

blig

ato

riarg

om

en

tid

el

main

faco

ltativ

i

cla

sse

e m

ain

dic

hia

rati

pu

blic

cla

sse

e m

ain

sen

za

qu

alific

he

cla

sse

e m

ain

dic

hia

rati

pu

blic

cla

sse

e m

ain

sen

za

qu

alific

he

Page 10: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

19

A. Longheu –Tecniche di programmazione avanzata

Caratte

ristiche di C

#

Nuove (vs. Ja

va)

�Call-b

y-reference parameters

�Stack-a

llocated objects (stru

cts)�

Block m

atrice

s�

Enumeratio

ns

�Uniform

type syste

m�

goto sta

tement

�Attrib

utes

�Syste

m-le

vel programming

�Versio

ning

Variazioni sintattic

he

�Component-b

ased programming

�Propertie

s�

Events

�Delegates

�Indexers

�foreach loop

�Boxin

g / u

nboxin

g�

...

20

A. Longheu –Tecniche di programmazione avanzata

Hello W

orld

us

ing

Sys

tem

;c

las

s H

ello

{s

tatic

vo

id M

ain

() {C

on

so

le.W

riteL

ine

("He

llo W

orld

");}} us

ing

Sys

tem

;c

las

s H

ello

{s

tatic

vo

id M

ain

() {C

on

so

le.W

riteL

ine

("He

llo W

orld

");}}

File Hello.cs

Compilazione (d

alla co

nsolle; p

roduce Hello.exe)

csc Hello.cs

Execution

Hello

�every C

# program m

ust h

ave a Main( ) m

ethod

�It is te

chnica

lly possib

le to

have m

ultip

le M

ain( ) m

ethods in

C#; in

that case you use the /m

ain command-lin

e sw

itch to tell C# which

cla

ss contains th

e M

ain( ) m

ethod th

at sh

ould se

rve as th

e entry

point

to th

e program.

Importa

il namespace System

La fu

nzio

ne prin

cipale deve esse

re

chiamata Main

Stampa su

console

Il nome del file

e quello della cla

sse

posso

no esse

re dive

rsi

Importa

il namespace System

La fu

nzio

ne prin

cipale deve esse

re

chiamata Main

Stampa su

console

Il nome del file

e quello della cla

sse

posso

no esse

re dive

rsi

Page 11: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

21

A. Longheu –Tecniche di programmazione avanzata

�Lo svilu

ppo può ch

iaramente esse

re fa

tto anche da

IDE come il Visu

al Studio, che offro

no il valore

aggiunto della syn

tax

highlightin

g, indentazio

ne

automatica

, completamento automatico

�To cre

ate th

e "H

ello W

orld

" program in

the Visu

al

Studio IDE, choose File�New Project

from the

menu to

olbar, e

selezio

nare “C

onsole Applica

tion”

nella se

zione Visu

al C

#�Windows

�Dopo avere scritto

il codice

sorgente, si e

segue la

compilazio

ne ch

e genera il co

dice

.exe;

Hello W

orld

22

A. Longheu –Tecniche di programmazione avanzata

�The .exe file

contains

op-co

des

writte

n in Micro

soft

Interm

ediate La

nguage (M

SIL); in

additio

n to

producin

g th

e

IL code (w

hich

is similar in

spirit to

Java's b

yte-co

de), th

e

compiler cre

ates a read-only

segment of the .exe file

in

which

it inserts

a sta

ndard Win32 executable header.

The

compiler desig

nates

an entry

point with

in the read-only

segment; th

e operatin

g syste

m lo

ader ju

mps to

that e

ntry

point w

hen yo

u ru

n th

e program, ju

st as it w

ould fo

r any

Windows p

rogram.

�l’esecuzio

ne può esse

re fa

tta dall’ID

E o da rig

a di co

mando

�The operatin

g syste

m ca

nnot e

xecute dire

ctly the IL co

de,

indeed th

e entry p

oint in

the W

in32 header a

ctually ju

mp to

the .N

ET Ju

st In Time (JIT

) compiler, w

hich

produces n

ative

CPU instru

ctions (note however that it

generates machine

language co

de only fo

r require

d fu

nctio

n)

Hello W

orld

Page 12: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

23

A. Longheu –Tecniche di programmazione avanzata

Stru

ttura di u

n programma C#

Programma

namespace A {...}

namespace B {...}

namespace C {...}

class X

{...}cla

ss Y {...}

class Z

{...}

File1.cs

File2.cs

File3.cs

�Se il n

amespace non è

specifica

to => default n

amespace (a

nonimo)

�I n

amespace posso

no co

ntenere stru

cts, interfa

ces, d

elegates e

enums

�I N

amespace posso

no esse

re usati in

altri file

24

A. Longheu –Tecniche di programmazione avanzata

Namespaces (C#) VS Packages (Ja

va)

Page 13: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

25

A. Longheu –Tecniche di programmazione avanzata

�Java does n

ot a

llow m

ultip

le packa

ges in

the sa

me

source

file

, while

C#

does

allow

multip

le

namespaces in

a sin

gle .cs file

�In Java, Packa

ges

and cla

sses

are mapped to

dire

ctorie

s and file

s, whereas

Namespaces

and

classe

s are not m

apped to

dire

ctorie

s and file

s

�Java has visib

ility packa

ge, C

# has o

nly visib

ility internal (!=

namespace)

Namespaces (C#) VS Packages (Ja

va)

26

A. Longheu –Tecniche di programmazione avanzata

Visib

ility Modifie

r "internal"

�Visib

ility internal re

fers to

what is visib

le durin

g a

compilatio

n

�csc A

.cs B.cs C

.cs �All in

ternal m

embers o

f A, B

, C se

e each other.

�csc /a

ddmodule:A.netm

odule,B.netm

odule C.cs

�C se

es th

e in

ternal m

embers o

f A and B

�(A and B m

ay b

e writte

n in

diffe

rent la

nguages)

Namespaces (C#) VS Packages (Ja

va)

Page 14: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

27

A. Longheu –Tecniche di programmazione avanzata

usin

g Syste

m;

class P

rog {sta

tic void Main() {

Counter c =

new Counter();

c.Add(3); c.A

dd(5);

Console.W

riteLin

e("va

l = " +

c.Val());

}}

usin

g Syste

m;

class P

rog {sta

tic void Main() {

Counter c =

new Counter();

c.Add(3); c.A

dd(5);

Console.W

riteLin

e("va

l = " +

c.Val());

}} Un programma in

2 File

cla

ss C

ou

nte

r {

int v

al =

0;

public

void

Ad

d (in

t x) { v

al =

val +

x; }

public

int V

al () { re

turn

val; }

} cla

ss C

ou

nte

r {

int v

al =

0;

public

void

Ad

d (in

t x) { v

al =

val +

x; }

public

int V

al () { re

turn

val; }

}

Prog.cs

Counter.cs

Compilazione

csc /target:e

xeCounter.cs P

rog.cs

Execuzione

Prog

Uso delle DLL

csc /t:library

Counter.cs

=> generates C

ounter.d

ll

csc /r:Counter.d

llProg.cs

=> generates P

rog.exe

28

A. Longheu –Tecniche di programmazione avanzata

Identifica

tori

Sintassi

Identifie

r = (le

tter | '_

' | '@') {le

tter | d

igit | '_

'}.•Unico

de!

•Case-se

nsitive

•"@

" perm

ette

di u

sare parole ch

iave co

me identifica

tori

-if

... Parola ch

iave

-@if... Id

entifica

tore

•Posso

no co

ntenere se

quenze di esca

pe Unico

de (e

.g. \u

03c0 per

π)Esempi

someName

sum_of3

_10perce

nt

@while

identifica

tore w

hile

πidentifica

tore π

\u03c0

identifica

tore π

b\u0061ck

identifica

tore back

Page 15: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

29

A. Longheu –Tecniche di programmazione avanzata

Parole ch

iave

abstra

ctas

base

bool

break

byte

case

catch

char

checke

dcla

ssconst

contin

ue

decim

al

default

delegate

do

double

else

enum

event

explicit

exte

rnfalse

finally

fixed

float

for

foreach

goto

ifimplicit

inint

interfa

ceinternal

islock

long

namespace

new

null

object

operator

out

overrid

eparams

priva

teprotecte

dpublic

readonly

ref

return

sbyte

sealed

short

sizeof

stacka

lloc

static

string

struct

switch

this

throw

true

trytyp

eof

uint

ulong

unchecke

dunsafe

ushort

usin

gvirtu

al

void

volatile

while

77 parole ch

iave in

C# risp

etto

alle 47 di Ja

va

30

A. Longheu –Tecniche di programmazione avanzata

Naming

Maiuscole/minuscole

�Le parole scritte

in m

aiusco

lo (e

s. ShowDialo

g)

�La prim

a lette

ra in

maiusco

lo ecce

tto ch

e per le

varia

bili p

rivate o

locali, le

costa

nti e

i campi

constan

ts maiu

scole

SIZE, M

AX_V

ALU

Elocal variab

les minusco

lei, to

p, su

mprivate field

sminusco

le data, lastE

lement

public field

smaiu

scole

Width, B

ufferLen

gth

properties

maiu

scole

Length, Fu

llNam

eenumeratio

n co

nstan

tsmaiu

scole

Red, B

lue

meth

ods

maiu

scole

Add, In

dexO

ftyp

esmaiu

scole

Strin

gBuilder

pred

efined typ

es minusco

leint, strin

gnam

espaces

maiu

scole

System

, Collectio

ns

La prim

a parola

•Nomi d

i funzio

ni vo

id devono in

iziare co

n un ve

rbo (e

.g. G

etHash

Cod

e)

•Gli a

ltri nomi co

n un so

stantivo

(e.g. size

, IndexO

f, Collection

s)•Gli e

numerativi o

i booleani p

osso

no in

iziare co

n un aggettivo

(Red, E

mpty)

Page 16: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

31

A. Longheu –Tecniche di programmazione avanzata

Numeri In

teri

Sintassi

DecConsta

nt =

digit {d

igit} {In

tSuffix}.

HexC

onsta

nt =

"0x" h

exD

igit {h

exD

igit} {In

tSuffix}.

IntSuffix =

'u' | 'U

' | 'l' | 'L'.Type

senza su

ffisso: il p

iùpicco

lo fra

int, u

int, lo

ng, u

long

suffisso

u, U

: il p

iùpicco

lo fra

uint, u

long

suffissi l, L:

il più

picco

lo fra

long, u

long

Esempi

17

int

9876543210

long

17Llong

17uuint

0x3fin

t0x10000

long

0x3fL

long

32

A. Longheu –Tecniche di programmazione avanzata

Numeri in

Virg

ola m

obile

Sintassi (s

emplific

ata)

RealConsta

nt

= [D

igits] ["." [D

igits]] [E

xp] [R

ealSuffix].

deve co

ntenere almeno una cifra

e ".", o

ppure Exp

Digits

= digit {d

igit}.

Exp =

("e" | "E

") ["+" | "-"] D

igits.

RealSuffix

= "f" | "F

" | "d" | "D

" | "m" | "M

".Type

senza su

ffisso: d

ouble

suffisso

f, F:

float

suffisso

d, D

: double

suffisso

m, M

: decim

al

Examples

3.14

double

1E-2

double

.1double

10f

float

Page 17: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

33

A. Longheu –Tecniche di programmazione avanzata

Strin

ghe e co

stanti ca

ratte

re

Sintassi

CharConsta

nt =

' char '.

Strin

gConsta

nt =

" {char} ".

char p

uò esse

re qualsia

si caratte

re tra

nne virg

olette

, fine lin

ea e \

Escape sequences

\''

\""

\\\

\00x0000

\a0x0007 (a

lert)

\b0x0008 (b

acksp

ace)

\f0x000c (fo

rm fe

ed)

\n0x000a (n

ew lin

e)

\r0x000d (ca

rriage re

turn)

\t0x0009 (h

orizo

ntal ta

b)

\v0x000b (ve

rtical ta

b)

Unicode-or hexadecimal escape sequences

\u0061a

\x0061a

34

A. Longheu –Tecniche di programmazione avanzata

Strin

ghe e co

stanti ca

ratte

re (2

)

Esempio di sequenze di escape

"file \"C

:\\sample.txt\""

file "C

:\sample.txt"

"file \x0

022C:\u

005csa

mple.txt\x0

022"

Se la strin

ga èpreceduta da @

•\non è

consid

erato ca

ratte

re di esca

pe

•Ogni “

deve esse

re ra

ddoppiata

•La strin

ga può andare a ca

po

Esem

pio

@"file

file

""C:\sa

mple.txt""“

"C:\sa

mple.txt"

Page 18: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

35

A. Longheu –Tecniche di programmazione avanzata

Commenti

Su sin

gola lin

ea

// un co

mmento

Delim

itati

/* un’altro

commento */

(non uno dentro

l’altro

)

Documentazio

ne

/// un co

mmento per la

documentazio

ne

36

A. Longheu –Tecniche di programmazione avanzata

Tipi d

i datoTypes

Value Types

Reference Types

Pointers

Simple Types

EnumsStructs

ClassesInterf.

ArrayDelegates

bool

charsbyte

short

int

long

byte

ushort

uint

ulong

float

double

decimal

Tutti i tip

i sono deriva

ti da object

-Posso

no esse

re asse

gnati a

d una va

riabile di tip

o object

-Tutti i m

etodi di object p

osso

no esse

re applica

ti a tu

tti i tipi

Tipi definiti d

all’utente

Tipi non esistenti in

Java

Page 19: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

37

A. Longheu –Tecniche di programmazione avanzata

Tipi d

i dato

�UnprogrammaC# in

fatti p

uò esse

re defin

ito co

me una

collezio

neditip

i�

Tutti

idatie il

codice

sonodefin

itiall’in

ternodeitip

i, non

esisto

noquindi fu

nzio

nio va

riabiliglobali

�I tip

i contengono:

�Data m

embers

�Fields, co

nsta

nts, a

rrays

�Events

�Functio

n m

embers

�Methods, o

perators, co

nstru

ctors, d

estru

ctors

�Propertie

s, indexers

�Altri tip

i�Classe

s, structs, e

nums, in

terfa

ces

38

A. Longheu –Tecniche di programmazione avanzata

Tipi d

i dato

�I tip

i posso

noesse

reista

nzia

ti…�…e quindiutilizza

ti: chiamandometodi, g

et a

nd

set p

ropertie

s, etc.

�Posso

noesse

reconvertiti

daun tip

oad un’altro

�Im

plicita

mente

o esplicita

mente

�I tip

i sonoorganizza

ti�Namespaces, file

s, asse

mblies

�Itip

i hannoun’organizza

zionegerarch

ica�Sono disp

onibili d

ue prin

cipali ca

tegorie

: tipi va

lue

e tip

i riferim

ento

Page 20: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

39

A. Longheu –Tecniche di programmazione avanzata

Tipo rife

rimento e tip

o va

lore

Valore

Riferim

ento

contiene

valore

riferim

ento

memorizzata

stack

heap

inizializzata

0, fa

lse, '\0

'null

assegnamento

copia il v

alore

copia il rife

rimento

esempio

int i =

17;

strin

g s = "H

ello";

int j= i;

strin

g s1= s;

17

i

17

j

ss1

H e l l o

40

A. Longheu –Tecniche di programmazione avanzata

�Vantaggitip

i value

�No

heap

allocatio

n,

quindi

minor

appesantim

ento

del G

C

�Più

effice

nza

nell’u

sodella

memoria

�Minor re

ference in

dire

ction

�Unifie

d typ

e syste

m

�Nessu

na

dico

tomia

prim

itive/object

(ecco

perch

è“Unifie

d”)

Tipi: U

nifie

d Type Syste

m

Page 21: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

41

A. Longheu –Tecniche di programmazione avanzata

Tipi p

rimitivi

long fo

rmin Ja

varange

sbyte

Syste

m.SByte

byte

-128 .. 1

27

byte

Syste

m.Byte

---0 .. 2

55

short

Syste

m.In

t16

short

-32768 .. 3

2767

ushort

Syste

m.UInt16

---0 .. 6

5535

int

Syste

m.In

t32

int

-231.. 2

31-1

uint

Syste

m.UInt32

---0 .. 2

32 -1

long

Syste

m.In

t64

long

-263.. 2

63-1

ulong

Syste

m.UInt64

---0 .. 2

64-1

float

Syste

m.Single

float

±1.5E-45 .. ±

3.4E38 (3

2 Bit)

double

Syste

m.Double

double

±5E-324 .. ±

1.7E308 (6

4 Bit)

decim

al

Syste

m.Decim

al---

±1E-28 .. ±

7.9E28 (1

28 Bit)

bool

Syste

m.Booleanboolean

true, fa

lsechar

Syste

m.Char

char

Unico

decharacte

r

Risp

etto

ai tip

i a virg

ola m

obile, il tip

o decimalècaratte

rizzato da una

maggiore precisio

ne (2

9 cifre

significa

tive vs 7

di flo

at e

15 di d

ouble) e

da un in

terva

llo rid

otto

che lo re

ndono adatto

per ca

lcoli fin

anzia

ri.

42

A. Longheu –Tecniche di programmazione avanzata

Tipi p

rimitivi

Page 22: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

43

A. Longheu –Tecniche di programmazione avanzata

Tipi p

redefin

iti:floatin

gpoint

�Segue lo sta

ndard IE

EE 754

�Supporta

±0, ±

infin

ito, N

aN

Syste

mT

yp

eB

yte

sT

ipo

C#

Syste

m.S

ing

le4

�flo

at

Syste

m.D

ou

ble

8d

ou

ble

44

A. Longheu –Tecniche di programmazione avanzata

Tipi p

redefin

iti:decim

al

�128bits

�96 bits

scalate di u

na potenza di 10

�Non su

pporta

±0, ±

infin

ito, N

aN

Syste

mT

yp

eB

yte

sT

ipo

C#

Syste

m.D

ecim

al

16

decim

al

Allintegertyp

escan beimplicitly

converte

dto

a decim

al

type

Conversio

ns b

etween decim

al a

nd flo

atin

g typ

es re

quire

explicit co

nversio

ndue to

possib

leloss

Page 23: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

45

A. Longheu –Tecniche di programmazione avanzata

Tipi p

redefin

iti:bool

�Rappresenta i va

lori lo

gici

�I su

oivalori so

no: tru

ee fa

lse�

Non si p

osso

no usare 1 e 0

�Non esiste

una co

nversio

ne sta

ndard co

n altri tip

i

Syste

mT

yp

eB

yte

sT

ipo

C#

Syste

m.B

oo

lean

1 (2

per a

rray)

bo

ol

46

A. Longheu –Tecniche di programmazione avanzata

Tipi p

redefin

iti:char

�Rappresenta un ca

ratte

re UNICODE

�Lite

rals

�‘A’// S

implecharacte

r�‘\u

0041’// U

nico

de

�‘\x0

041’// U

nsig

ned sh

ort h

exadecim

al

�‘\n

’// E

scape se

quence ch

aracte

r

Syste

mT

yp

eB

yte

sT

ipo

C#

Syste

m.c

ha

r2

ch

ar

Page 24: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

47

A. Longheu –Tecniche di programmazione avanzata

decim

al

128 bit in

virgola fissa

(-1)s* c *

10

-es =

0 or 1

0 <= c <

296

0 <= e <= 28

Per le

operazio

ni

•Con grandi n

umeri

•Precisio

ne alta (e

.g. 0

.1 = 1 * 10

-1)

=> Necessa

ri nei ca

lcoli fin

anzia

ri

48

A. Longheu –Tecniche di programmazione avanzata

�Object

�strin

g

Tipi p

redefin

iti:reference

type

Page 25: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

49

A. Longheu –Tecniche di programmazione avanzata

Object

�Rootof o

bject

hierarch

y�

Storage(book ke

eping) o

verhead

�0 byte

sforvaluetyp

es

�8 byte

sforreference

types

�Anactu

alreference

(notthe object) u

ses4 byte

s, sin

ce m

emory is a

llocated in

chunks o

f 4 byte

s at a

tim

e

Syste

mT

yp

eB

yte

sT

ipo

C#

Syste

m.O

bje

ct

0/8

ove

rhead

ob

ject

50

A. Longheu –Tecniche di programmazione avanzata

C#: La

Classe

Syste

m.Object

�La cla

sse Syste

m.Object

(cui co

rrisponde l’a

lias o

bject) svo

lge in

C# il ru

olo della cla

sse Object

(java.lang.Object) d

i Java

�èla ca

postip

ite di tu

tte le cla

ssi�defin

isce i m

etodi E

quals(virtu

ale), G

etType, T

oStrin

g(virtu

ale),

GetHashCode(virtu

ale),

�defin

isce le fu

nzio

ni sta

tiche Equals/2

e ReferenceEquals/2

�defin

isce

inoltre

alcu

ni

metodi

protetti

come

Finalize

, Memberw

iseClone

�ATTENZIONE:

Equals

per

default

verifica

l’uguaglianza

fra

riferim

enti,

ma alcu

ne cla

ssi deriva

te posso

no rid

efin

irlo e/o

posso

no defin

ire l’o

peratore =

=. A

d esempio, strin

grid

efin

isce =

=

così

da ve

rificare l’u

guaglianza di co

ntenuto, m

a non

fa lo stesso

con Equals!

Page 26: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

51

A. Longheu –Tecniche di programmazione avanzata

Strin

g

�Animmutablesequence

of U

nico

decharacte

rs�Reference

type

�Specia

l syntax fo

rlite

rals

�strin

gs =

“I am

a strin

g”;

SystemType

Bytes

Tipo C#

System.Strin

gMinimo 20

strin

g

52

A. Longheu –Tecniche di programmazione avanzata

C#vs

JAVA: S

TRINGHE

Java

�Le strin

ghe so

no ista

nze

della cla

sse Strin

g�

Si cre

ano nuove ista

nze

stringa co

n new

�Si cre

ano nuove ista

nze

specifica

ndo strin

ghe co

stanti

("ciao")

�L'o

peratore == va

le fra

rife

rimenti (n

o aliasin

g):

l'identità

di co

ntenuto è

verifica

ta dal m

etodo equals

�L'o

peratore

!= va

le fra

rife

rimenti (n

o aliasin

g): la

dive

rsitàdi co

ntenuto è

contro

llata da !e

quals

C#

�Le strin

ghe so

no ista

nze

della cla

sse predefin

ita strin

g�

Non si p

osso

no cre

are nuove

istanze strin

ga co

n new

�Si cre

ano nuove ista

nze

specifica

ndo strin

ghe co

stanti

("ciao")

�L'o

peratore == è

overlo

aded

per le

stringhe e va

luta

l'identità

di co

ntenuto (n

on

esiste

equals)

�L'o

peratore !=

èoverlo

aded

per le

stringhe e va

luta la

dive

rsitàdi co

ntenuto (n

on

esiste

equals)

Page 27: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

53

A. Longheu –Tecniche di programmazione avanzata

Test U

guaglianza In

C#

usin

gSystem

;class E

sempio5

{public static

voidMain

(){strin

gs1 = "ciao

", s2 = "ciao

"; // new

string è

ERRATO

Console.W

riteLine((s1

==s2) ? "u

guali" : "d

iverse");Perso

na p

1 = new

Perso

na("Joh

n", 2

3),

p2 = new

Person

a("Holly", 1

8);

Console.W

riteLine((p

1==p2) ? "u

guali" : "d

iverse");}}

class Perso

na {

stringnome;

inteta;

public P

ersona(strin

gnome, in

teta){

this.n

ome=

nome;

this.eta

=eta;}

l'operatore == è

ridefin

ito per strin

g→

test ve

rifica l' id

entità

di contenuto

l'operatore == è

ridefin

ito per strin

g→

test ve

rifica l' id

entità

di contenuto

l'operatore == non è

ridefin

ito per persona

→test fra

riferim

enti (a

liasin

g)

l'operatore == non è

ridefin

ito per persona

→test fra

riferim

enti (a

liasin

g)

54

A. Longheu –Tecniche di programmazione avanzata

Syste

m.Strin

g

Può esse

re usata co

me il tip

o sta

ndard strin

g

string s =

"Alfonso";

Note

�Le Strin

gs n

on posso

no esse

re m

odifica

te (tip

o Strin

gBuilder

per m

odifica

re)

�Posso

no esse

re co

ncatenate +: "D

on " +

s�

Posso

no esse

re in

dicizza

te: s[i]

�Calco

lo della lu

nghezza

: s.Length

�Le strin

ghe so

no dei rife

rimenti e

, quindi, a

dotta

no la se

mantica

dei rife

rimenti n

ella asse

gnazio

ni

�== e !=

confro

ntano il co

ntenuto: if (s =

= "A

lfonso") ...

�La cla

sse Strin

g defin

isce I m

etodi p

er m

anipolare le strin

ghe:

CompareTo, In

dexO

f, StartsW

ith, S

ubstrin

g, ...

Page 28: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

55

A. Longheu –Tecniche di programmazione avanzata

User-d

efin

edTypes

�Enumeratio

ns

enum

�Arra

ysint[], strin

g[]

�Interfa

ceinterfa

ce

�Reference

type

class

�Valuetyp

e

struct

�Functio

npointer

delegate

56

A. Longheu –Tecniche di programmazione avanzata

Compatib

ilitàfra

i tipi p

rimitivi

Le se

guenti a

ssegnazio

ni so

no va

lide

intVar =

shortVar;

intVar =

charVar;

floatVar = charVar;

decimalVar = (decimal)doubleVar;

Atte

nzio

ne alle co

nversio

ni co

n possib

ile perdita

(long�float�

long, il n

umero long potre

bbe ca

mbiare)

decim

al

double

float

long

int

short

sbyte

ulong

uint

ushort

byte

char

Cast

Obbligatorio

Page 29: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

57

A. Longheu –Tecniche di programmazione avanzata

�Im

plicit

conversio

ns

�Occu

r automatica

lly

�Guaranteed to

succe

ed

�No in

form

atio

n (p

recisio

n) lo

ss

�Explicit co

nversio

ns

�Require

a ca

st

�May n

ot su

cceed

�Inform

atio

n (p

recisio

n) m

ight b

e lost

�Both im

plicit a

nd explicit co

nversio

ns ca

n be user-

defin

ed

Tipi: co

nversio

ni

58

A. Longheu –Tecniche di programmazione avanzata

Esempi:

�intx =

123456;

�long y =

x; // implicit

�short z =

(short)x; // e

xplicit

�double d = 1.2345678901234;

�float f =

(float)d

; // explicit

�long l =

(long)d; // e

xplicit

Tipi: co

nversio

ni

Page 30: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

59

A. Longheu –Tecniche di programmazione avanzata

�Come in C++, in C# è

possib

ile definire operatori di

conversione di tipo per

specifica

re come convertire

(automatica

mente o m

eno) u

n tip

o in

un altro

�Operatori d

i conversio

ne:

public static o

perato

r implicit tip

oFinale(tip

oIniz v)

{ return valo

reCon

vertito }public static o

perato

r explicit tip

oFinale(tip

oIniz v)

{ return valo

reCon

vertito}

�Gli operatori

impliciti

vengono chiamati

automatica

mente

quando necessa

rio, m

entre

quelli e

spliciti ve

ngono ch

iamati

solo in

presenza di u

na co

nversio

ne esplicita

di tip

o (ca

st)

Tipi: co

nversio

ni

60

A. Longheu –Tecniche di programmazione avanzata

Esempio di co

nversio

ne im

plicita

automatica

da Countera int:

Cou

nter

c = new

Cou

nter(); c.stato

= 18;

int valore =

c; // conv. im

plicita d

a Cou

nter

a int

...public static

implicit

operator in

t(Cou

nter

c){return c.stato;}

public class C

ounter

{ // una classe q

ualsiasi

private in

tval;

public C

ounter(){ val=

0;}

public in

t stato { // p

roprietà

get

{ return val; }

set{ if(valu

e>0) val=

value; }

}} Tipi: co

nversio

ni

Page 31: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

61

A. Longheu –Tecniche di programmazione avanzata

Counter

c = new

Counter(); c.stato

= 18

;int valo

re = (in

t)c; // conv. esp

licita Counter

-> int

publicstaticexplicit

operator in

t(Counterc){

return c.sta

to;}

public

class Counter

{ // una classe q

ualsiasi

intval;

public C

ounter(){ val=

0;}

public in

t stato { // p

roprietà

get { retu

rn val; }

set { if(value>

0) val=

value; }

}}

�Esempio di co

nversio

ne esplicita

(quindi n

on automatica

, richiede un ca

st)da Countera int:

Tipi: co

nversio

ni

�Questo

esempio ed il p

recedente so

no entra

mbi p

ossib

ili; in generale, si

deve defin

ire una co

nversio

ne esplicita

se il crite

rio sta

bilito

potre

bbe non

avere succe

sso e/o se si

posso

no verifica

re perdite di precisio

ne, se

invece si

èsce

lto un crite

rio che NON fallisce

, si

può adotta

re quella

implicita

62

A. Longheu –Tecniche di programmazione avanzata

�L'o

peratore asconsente di te

ntare una co

nversio

ne

esplicita

di tip

o (a run-tim

e),

ma senza sca

tenare

un'ecce

zione in

caso di fa

llimento

�Se la conversio

ne non rie

sce, vie

ne semplice

mente

restitu

ito null

...Counter

c = new

Cou

nter();

if((c asint)!=

null) {

int valo

re=c+

+;

} Tipi: co

nversio

ni

Page 32: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

63

A. Longheu –Tecniche di programmazione avanzata

Enumeratio

n

Lista di co

stanti

Dichiarazione(live

llo del n

amespace)

enum

Color {R

ed, B

lue, G

reen} // va

lori: 0

, 1, 2

enum

Acce

ss {Perso

nal=1, G

roup=2, A

ll=4}

enum

Acce

ss1 : b

yte{Perso

nal=1, G

roup=2, A

ll=4}

UsoColor c = Color.Blue;// un enumeratore deve essere qualific

ato

Access a = Access.Perso

nal | Access.G

roup;

// a contiene un insieme di valori

if ((Access1.Perso

nal & a) !=

0) Console.Write

Line("a

ccess granted");

UsoColor c = Color.Blue;// un enumeratore deve essere qualific

ato

Access a = Access.Perso

nal | Access.G

roup;

// a contiene un insieme di valori

if ((Access1.Perso

nal & a) !=

0) Console.Write

Line("a

ccess granted");

64

A. Longheu –Tecniche di programmazione avanzata

Operazio

ni su

lle enumerazio

ni

Operazio

ni va

lide

confro

nto

if (c == Color.R

ed) ...

if (c> Color.R

ed && c <

= Color.G

reen) ...

+, -

c = c +

2;

++, --

c++;

&if ((c &

Color.R

ed) =

= 0) ...

|c =

c | Color.B

lue;

~c =

~ Color.R

ed;

Il compilatore non ve

rifica se

il risultato è

un va

lore apparte

nente

all’in

sieme dei va

lori va

lidi

Nota

-Non è

possib

ile asse

gnare ad un in

t (tranne co

n il ca

st).

-Enumeratio

n deriva

da object ( E

quals, T

oStrin

g, ...).

-La cla

sse System

.Enum

esporta

operazio

ni su

lle enumerazio

ni

(GetN

ame, Form

at, GetV

alues, ...).

Page 33: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

65

A. Longheu –Tecniche di programmazione avanzata

Nullable typ

es

�I tip

i nullable sono ista

nze della stru

ttura Syste

m.Nullable. Un tip

o

nullable può ra

ppresentare l'in

terva

llo norm

ale di va

lori p

er il

relativo

tip

o di va

lore so

ttosta

nte, p

iùun va

lore nullaggiuntivo

. �

Ad esempio, al valore Nullable<Int32>, che si

legge "Nullable di

Int32",

può esse

re asse

gnato qualsia

si valore compreso tra

-

2147483648 e 2147483647 oppure il

valore null.

A un valore

Nullable<bool> può in

vece esse

re asse

gnato il va

lore tru

eo false

oppure null.

�La possib

ilitàdi asse

gnare null

a tip

i numerici

e Boolean risu

lta

partico

larm

ente utile

quanto si u

tilizzano database e altri tip

idi d

ati

contenenti e

lementi a

cui n

on sa

rebbe possib

ile asse

gnare un va

lore.

Ad esempio, in un campo Boolean di un database è

possib

ile

arch

iviare il va

lore tru

eo falseoppure è

possib

ile lascia

rlo in

defin

ito.

�Il n

ullable typ

e se

rve per e

stendere ai tip

i prim

itivi il valore

null g

iàusato per i tip

i riferim

ento

66

A. Longheu –Tecniche di programmazione avanzata

class N

ullableExample {

static vo

id Main() {

int? n

um = null;

if (num.HasValue == tru

e)

{ Syste

m.Console.W

riteLin

e("n

um = " +

num.Value); }

else

{ S

ystem.Console.W

riteLin

e("n

um = Null"); }

//y is set to

zero

int y =

num.GetValueOrDefault();

// num.Value th

rows a

n In

validOperatio

nExce

ptio

n if n

um.HasValue

is false

try { y =

num.Value; }

catch

(Syste

m.In

validOperatio

nExce

ptio

n e)

{ Syste

m.Console.W

riteLin

e(e.Messa

ge); }

}}

Nullable typ

es

Page 34: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

67

A. Longheu –Tecniche di programmazione avanzata

�Non è

possib

ile cre

are un tip

o nullable basato su

un tip

o di

riferim

ento. (i

tipi di rife

rimento supporta

no già

il valore

null)

�La

sintassi

T?

èuna

form

a

abbrevia

ta

di

Syste

m.Nullable<T>, in

cui T

èun tip

o di va

lore. Le

due

form

e so

no in

terca

mbiabili.

�Asse

gnazio

ne un va

lore a un tip

o nullable in

t? x = 10; o

double? d

= 4.108;

�Utilizza

re la proprie

tàSyste

m.Nullable.GetValueOrDefault

per re

stituire

il valore asse

gnato o il va

lore predefin

ito per il

tipo sotto

stante se il valore è

null,

ad esempio int j =

x.GetValueOrDefault();

�I tip

i nullable nidifica

ti non sono consentiti,

ad esempio:

Nullable<Nullable<int>> n; N

ON ve

rràcompilata.

Nullable typ

es

68

A. Longheu –Tecniche di programmazione avanzata

�Utilizza

re le

proprie

tàin so

la le

ttura HasValuee Valueper

verifica

re se

il valore è

null e

per re

cuperarlo

, ad esempio

if(x.HasValue) j =

x.Value;

�HasValue restitu

isce tru

e se la varia

bile contiene un

valore, fa

lse se

ènull.

�La proprie

tàValue re

stituisce

un va

lore se

ne è

stato

asse

gnato uno,

in caso contra

rio vie

ne generata

un'ecce

zione Syste

m.In

validOperatio

nExce

ptio

n.

�Per

imposta

zione predefin

ita,

una varia

bile di tip

o

nullable im

posta

HasValue su

false

. Value è

indefin

ito.

�Utilizza

re

l'operatore

?? per

asse

gnare

un

valore

predefin

ito ch

e ve

rràapplica

to quando un tip

o nullable, il

cui va

lore co

rrente è

null, vie

ne asse

gnato a un tip

o non

nullable, a

d esempio in

t? x = null; in

t y = x ?? -1

;

Nullable typ

es

Page 35: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

69

A. Longheu –Tecniche di programmazione avanzata

Boxin

g/Unboxin

g

�I tip

i valore (in

t, struct, e

num) so

no co

mpatib

ili con object (n

on so

no necessa

rie cla

ssi wrapper)!

Boxing

l’istruzio

ne

object obj = 3;

trasfo

rma il va

lore nell’o

ggetto

3 nell’h

eap

Unboxing

l’istruzio

ne

int x = (in

t) obj;

esegue l’o

perazio

ne in

versa

3

obj

70

A. Longheu –Tecniche di programmazione avanzata

Boxin

g/Unboxin

g

�Perm

ette

l’implementazio

ni d

i contenito

ri generici

class Queue {

...public vo

id Enqueue(ob

ject x) {...}public o

bject D

equeue() {...}

...}

�Queue può esse

re usato sia

per i rife

rimenti ch

e per i

valoriQueue q

= new

Queue();

q.Enqueue(n

ew Rectan

gle());

q.Enqueue(3

);Rectan

gle r =

(Rectan

gle) q

.Dequeue();

int x =

(int) q

.Dequeue();

Page 36: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

71

A. Longheu –Tecniche di programmazione avanzata

�In Ja

va, i tip

i prim

itivi non so

no oggetti

�quando occo

rre

tratta

rli come oggetti,

biso

gna

ricorre

re alle cla

ssi wrapper

�il p

assa

ggio da va

lore prim

itivo a oggetto

e vice

versa

va svo

lto esplicita

mente, per costru

zione o tra

mite

appositi m

etodi (in

tValue, flo

atValue, e

tc)�

In C#,

i tip

i prim

itivi non sono oggetti

ma sono

assim

ilabili a

d essi q

uando fa

comodo

�non esisto

no cla

ssi wrapperesplicite

�il p

assa

ggio da va

lore prim

itivo a oggetto

e vice

versa

avvie

ne automatica

mente, tra

mite un procedimento

noto co

me boxin

g / u

nboxin

g (l'u

nboxin

g rich

iede un

cast)

Boxin

g/Unboxin

g

72

A. Longheu –Tecniche di programmazione avanzata

Boxin

g

�Copies a

value typ

e in

to a re

ference typ

e (o

bject)

�Each value typ

e has

corre

sponding “hidden”reference

type

�Note th

at a

reference-typ

e co

py is m

ade of th

e va

lue typ

e�

Value typ

es a

re never a

liased

�Value typ

e is

converte

d implicitly

to object,

a reference

type

�Esse

ntially a

n “u

p ca

st”

Page 37: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

73

A. Longheu –Tecniche di programmazione avanzata

Unboxin

g

�Inverse

operatio

n of b

oxin

g�

Copies th

e va

lue out o

f the box

�Copies fro

m re

ference typ

e to

value typ

e�

Require

s an explicit co

nversio

n�

May n

ot su

cceed (like

all e

xplicit co

nversio

ns)

�Esse

ntially a

“down ca

st”

74

A. Longheu –Tecniche di programmazione avanzata

// bo

xin

g

int

x =

10;

ob

jec

t ob

j=

x;

// un

bo

xin

g

int

y =

(int)o

bj;

x x1

01

0

ob

jo

bj

• •S

ys

tem

.int3

2S

ys

tem

.int3

2• •

10

10

y y1

01

0

Boxin

g/Unboxin

g

�Esempi:

Page 38: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

75

A. Longheu –Tecniche di programmazione avanzata

Boxin

g�

Vantaggi:

�Enables p

olym

orphism

acro

ss all typ

es

�Collectio

n cla

sses w

ork w

ith all typ

es

�Elim

inates n

eed fo

r wrapper cla

sses

�Replaces O

LE Automatio

n's V

aria

nt

�In M

icrosoft W

indowsapplica

tions p

rogramming, OLE Automation, is

an in

ter-p

rocess co

mmunica

tion(IP

C) m

echanism

based on Component

Object M

odel(COM) th

at w

as in

tended fo

r use by scrip

ting languages–

orig

inally

Visu

al Basic

–but now are used by

languages

run on

Windows.

It provid

es an infra

structu

re whereby

applica

tions called

autom

ation con

trollerscan acce

ss and m

anipulate (i.e

. set p

ropertie

s of

or ca

ll methods o

n) sh

ared au

tomation

objects

that a

re exporte

d by

other a

pplica

tions. It su

perse

des D

ynamic D

ata Exch

ange(DDE), a

n

older m

echanism

for a

pplica

tions to

contro

l one another. A

s with

DDE,

in OLE Automatio

n the automatio

n contro

ller is

the "clie

nt"

and the

applica

tion exportin

g th

e automatio

n objects is th

e "se

rver".

�Svantaggi

�Perfo

rmance co

st�

The need fo

r boxin

g w

ill decre

ase w

hen th

e CLR

supports g

enerics

(similar

to C++ te

mplates)

76

A. Longheu –Tecniche di programmazione avanzata

Form

atta

zione Output

�Console.W

rite(in

tVal);

�Console.W

riteLin

e(in

tVal);

�Console.W

rite("H

ello {0

}", name);

//�

Console.W

riteLin

e("{0

}= {1

}", x, y);

Placeholder

"{" n ["," w

idth] [":" fo

rmat [p

recisio

n]] "}"

nposizio

ne dell’a

rgomento

width

dimensio

ne m

inima

format

codice

di fo

rmato (e

.g. d

, f, e, x, ...)

precision

numero di cifre

(dopo la virg

ola)

Page 39: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

77

A. Longheu –Tecniche di programmazione avanzata

Esempi:

int x =

17;

Console.W

riteLin

e( "{0

}", x);17

Console.W

riteLin

e("{0

,5}", x);

17

Console.W

riteLin

e("{0

:d}", x);

17

Console.W

riteLin

e( "{0

:d5}", x);

00017

Console.W

riteLin

e("{0

:f}", x);17.00

Console.W

riteLin

e("{0

:f1}", x);

17.0

Console.W

riteLin

e( "{0

:E}", x);

1.700000E+001

Console.W

riteLin

e("{0

:E1}", x);

1.7E+001

Console.W

riteLin

e( "{0

:x}", x);11

Console.W

riteLin

e("{0

:x4}", x);

0011

Form

atta

zione Output

78

A. Longheu –Tecniche di programmazione avanzata

Formattazione di strin

ghe:

usin

g System

;usin

g System

.Glob

alization;

class formattazion

e {static void

Main

(){// Form

at a negative in

teger or floatin

g-poin

t number in

various w

ays.Con

sole.WriteLin

e("Stan

dard

Numeric Form

at Specifiers");

string s =

Strin

g.Fo

rmat( "(C

) Curren

cy: . . . . . . . . {0:C}\n

" +"(D

) Decim

al:. . . . . . . . . {0:D}\n

" +"(E

) Scien

tific: . . . . . . . {1:E}\n

" +"(F) Fixed

poin

t:. . . . . . . {1:F}\n

" +"(G

) General:. . . . . . . . . {0

:G}\n

" +" (d

efault):. . . . . . . . {0

} (defau

lt = 'G

')\n" +

"(N) N

umber: . . . . . . . . . {0

:N}\n

" +"(P

) Percen

t:. . . . . . . . . {1:P}\n

" +"(X

) Hexad

ecimal:. . . . . . . {0

:X}\n

", -123, -7

89.45f);

Con

sole.WriteLin

e(s);…

Form

atta

zione Output

Page 40: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

79

A. Longheu –Tecniche di programmazione avanzata

Uscita:

-stringa0-=

-000c-

Stan

dard

Numeric Form

at Specifiers

(C) C

urren

cy: . . . . . . . . -? 123,00

(D) D

ecimal:. . . . . . . . . -1

23

(E) S

cientific: . . . . . . . -7

,894500E+002

(F) Fixed poin

t:. . . . . . . -789,45

(G) G

eneral:. . . . . . . . . -1

23

(defau

lt):. . . . . . . . -123 (d

efault =

'G')

(N) N

umber: . . . . . . . . . -1

23,00

(P) P

ercent:. . . . . . . . . -7

8.945,00%

(R) R

ound-trip

: . . . . . . . -789,45

(X) H

exadecim

al:. . . . . . . FFFFFF85

Form

atta

zione Output

80

A. Longheu –Tecniche di programmazione avanzata

…float i=

43.18F;

s = i.T

oStrin

g("c", n

ew Cultu

reInfo("en

-GB"));

Console.W

riteLine("\n

LOCALIT

AZION Great B

ritain : "+

s+"\n

");s =

i.ToStrin

g("c", n

ew Cultu

reInfo("it-C

H"));

Console.W

riteLine("\n

LOCALIT

AZION Switzerlan

d : "+

s+"\n

");

// Form

at the cu

rrent d

ate in vario

us w

ays.Console.W

riteLine("S

tandard

DateT

ime Fo

rmat S

pecifiers");

DateT

ime th

isDate =

DateT

ime.N

ow;

s = Strin

g.Fo

rmat( "(d

) Short d

ate: . . . . . . . {0:d}\n

" +"(D

) Long date:. . . . . . . . {0

:D}\n

" +"(t) S

hort tim

e: . . . . . . . {0:t}\n

" +"(T

) Long tim

e:. . . . . . . . {0:T}\n

", thisD

ate);Console.W

riteLine(s);}

Form

atta

zione Output

Page 41: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

81

A. Longheu –Tecniche di programmazione avanzata

Uscita:

LOCALIT

AZION Great B

ritain : £

43.18

LOCALIT

AZION Switzerlan

d : S

Fr. 43.18

Stan

dard

DateT

ime Form

at Specifiers

(d) S

hort d

ate: . . . . . . . 23/11/2008

(D) Lon

g date:. . . . . . . . d

omenica 2

3 novem

bre 2

008

(t) Short tim

e: . . . . . . . 18.50

(T) Lon

g tim

e:. . . . . . . . 18.50.15

(f) Full d

ate/short tim

e: . . domenica 2

3 novem

bre 2

008 1

8.50

(F) Full d

ate/long tim

e:. . . domenica 2

3 novem

bre 2

008 1

8.50.15

(g) G

eneral d

ate/short tim

e:. 23/11/2008 18.50

(G) G

eneral d

ate/long tim

e: . 23/11/2008 18.50.15

(defau

lt):. . . . . . . . 23/11/2008 18.50.15 (d

efault =

'G')

(M) M

onth:. . . . . . . . . . 2

3 novem

bre

(R) R

FC1123:. . . . . . . . . S

un, 2

3 Nov 2

008 18:50

:15 GMT

(Y) Y

ear: . . . . . . . . . . novem

bre 2

008

Form

atta

zione Output

82

A. Longheu –Tecniche di programmazione avanzata

Output su

File

usin

g System

;usin

g System

.IO;

class Test {

static void Main

() {FileS

tream s =

new

FileStream

("output.txt", FileM

ode.C

reate);Stream

Writer w

= new

Stream

Writer(s);

w.W

riteLine("T

able o

f squares:");

for (in

t i = 0; i <

10; i+

+)

w.W

riteLine("{0

,3}: {1

,5}", i, i*

i);

w.Close();

}}

Page 42: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

83

A. Longheu –Tecniche di programmazione avanzata

Uscita:

D:\>

more o

utput.txt

Table o

f squares:

0: 01: 12: 43: 94: 1

65: 2

56: 3

67: 4

98: 6

49: 8

1

Output su

File

84

A. Longheu –Tecniche di programmazione avanzata

Input

Input da tastiera:

int ch

= Console.Read();

Strin

g s =

Console.ReadLin

e();

Input da file

:usin

g System

;usin

g System

.IO;

class Test {

static void Main

() {FileS

tream s =

new

FileStream

("input.txt", FileM

ode.O

pen);

Stream

Read

er r = new

Stream

Read

er(s);strin

g lin

e = r.R

eadLin

e();while (lin

e != null) {

Console.W

riteLine(“Lettu

ra da file…

:”+line);

line =

r.Read

Line();

}r.Close();

}}

Page 43: Origini di C# - unict.it · 2009-11-03 · E’consentito l’accesso alla memoria attraverso i puntat ori (unsafe mode) E’supportata una preprocessor-like syntax E’possibile

85

A. Longheu –Tecniche di programmazione avanzata

Uscita:

Lettu

ra da file

:file da leggere (rig

a1)

Lettu

ra da file

:riga2

Lettu

ra da file

:riga3

Lettu

ra da file

:4...

Lettu

ra da file

:5...

Lettu

ra da file

:penultim

a rig

a (6

)

Lettu

ra da file

:ultim

a (rig

a 7)

Input d

a File

86

A. Longheu –Tecniche di programmazione avanzata

Parametri d

a lin

ea di co

mando

usin

g System

;

class Test {

static void Main

(string[] arg

) {//in

vocato

come T

est value =

3for (in

t i = 0; i <

arg.Len

gth; i+

+)

Console.W

riteLine("{0

}: {1}", i, arg

[i]);//

0: valu

e//

1: =

//2: 3

foreach

(string s in

arg)

Console.W

riteLine(s);

// output:

//valu

e//

=//

3}}